Hi everyone! I am new to embedded linux systems and the beaglebone black. I have had some interest lately in creating a DCC model railroad controller for a while now, and while I have seen examples out there for Arduino and the RPi, not much is out there in the way of handling something like this on the beaglebone. The DCC signal is sent to the locomotives through the track via square-waveform AC in the voltage range of ±8v to ±22 v. A binary 0 is represented by a 100 microsecond +v, and a 100 microsecond -v, and a 1 is 58 microseconds +, -. My plan was to use an H-bridge setup to provide the +15v to the tracks, and use a GPIO pin on the board to control the h-bridge. One example I saw in Python for the RPi used a for loop to write the binary information in a similar fashion to this (c-type code below):
`
string bit_pattern = “111111111100100101”; // example string
for (int i = 0; i < bit_pattern.length(); i++) {
if (bit_pattern[i] == ‘1’) {
writePin (WHICHEVER_GPIO, PIN_HIGH);
usleep (binary_one_delay); // delay for ~58 microseconds
writePin (WHICHEVER_GPIO, PIN_LOW); // turn the pin back off
usleep (binary_one_delay); // and delay again to represent 1
}
else if (bit_pattern[i] == ‘0’) {
// same as above, using different delay pattern
}
}
// the DCC spec says there must be a delay here, I think it was 20 microseconds minimum?
usleep(packet_space_delay);
`
I’m not sure that the usleep function (or nanosleep) can provide the microsecond resolution I need here. The DCC spec also says that the packet should be resent several times to ensure packet delivery, so would it be possible to get this to work using the usleep() or nanosleep() timer and GPIO pins with this kind of accuracy if I am resending the packets, say, 10 times? I am currently reading through Derek Molloy’s book on the beaglebone so if I have to do something like use the PRUs I will do so, but I am really new to all of this and the amount of information out there is just overwhelming! Advice on how to proceed is of course greatly appreciated. Thanks!