CRC8 – Arduino and PHP implementation

For my tank project, I’ll be sending parameters over radio to control the motors so the data packets should be checked to see if they’re valid or if the transmission was corrupted. This is a widely used concept in computing – almost every transaction comes with a checksum which lets you know whether the data that was sent is the same data that you received. If you’ve ever seen a cyclic redundancy check error on older versions of Windows, you’ve seen a bad checksum; the hard drive transmitted something that the operating system checked and found it wasn’t correct.

Data-Error-Cyclic-Redundancy-Check

EDIT

Looks like someone has beaten me to it, and created something much better. Here is an implementation which uses the built-in CRC module on the Teensy 3 to improve CRC calculation speed, and also creates 32 bit checksums.

Continue reading CRC8 – Arduino and PHP implementation

Capturing servo RC PWM signals with a Teensy 3.1

Turnigy 9X receiver without its plastic case

For my tank project I needed a failsafe should my serial radio link crap out on me, and as I had a standard RC transmitter lying around, it seemed natural to use it. After doing a bit of reading and prototyping, I managed to come up with a fast, non-blocking method of capturing the RC signals and converting them into a usable value.
Continue reading Capturing servo RC PWM signals with a Teensy 3.1

Software reset Teensy 3.1

For my tank project it was useful to be able to sense when a reset signal is sent and restart the Teensy via software. A quick google later and I found this post by kam42, which describes a macro which does exactly what I needed.

For the sake of completeness, heres a full sketch that would reset every 5 seconds. Don’t do this as I doubt constantly restarting is particularly healthy for the chip.

[c]
#define CPU_RESTART_ADDR (uint32_t *)0xE000ED0C
#define CPU_RESTART_VAL 0x5FA0004
#define CPU_RESTART (*CPU_RESTART_ADDR = CPU_RESTART_VAL);

void setup() {
}

void loop() {
CPU_RESTART
delay(5000);
}
[/c]

This will break the USB serial connection, so your serial monitor will fail, and you’ll have to reconnect.