bzr branch
http://bzr.ed.am/elec/quadcopter
| 16
by Tim Marston added (unfinished) rc-interface module to src; added arduino.mk | 1 | // | 
| 2 | // main.ino | |
| 3 | // | |
| 4 | // This software is intended to be run on a small Arduino (e.g., a Pro Mini), | |
| 5 | // whose purpose is dedicated to talking to the RC system. That is to say, it | |
| 6 | // listens to the PPM signal from the RC receiver and produces a compatible | |
| 7 | // single for the ESCs to control the motors. It additionally talks to the main | |
| 8 | // board via a trivial serial protocol. In so doing, this software relieves the | |
| 9 | // main board (and software running on it) of the task of interfacing with any | |
| 10 | // of the RC system. | |
| 11 | // | |
| 17
by Tim Marston rc-interface: mostly completed it (untested, but rx and tx code should work) | 12 | // Receiver | 
| 13 | // -------- | |
| 14 | // | |
| 16
by Tim Marston added (unfinished) rc-interface module to src; added arduino.mk | 15 | // The 8 channels (from the RC receiver) need to be combined and fed to two | 
| 16 | // interrupts on the Arduino. They need to be combined in such a way as to | |
| 17 | // alternate pulses between the two interrupts (which are alternately used to | |
| 18 | // read the pulses). Like this: | |
| 19 | // | |
| 20 | // ch1 ch3 ch5 ch7 ch2 ch4 ch6 ch8 | |
| 21 | // | | | | | | | | | |
| 22 | // ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ | |
| 23 | // ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ | |
| 24 | // ___ | | | | | | | | ___ | |
| 25 | // GND ---|___|---+----+----+----+ +----+----+----+----|___|--- GND | |
| 26 | // R | | R | |
| 27 | // ____________________ | __ | _____________________ | |
| 28 | // | | | |
| 29 | // pin 2 o o pin 3 | |
| 30 | // (interrupt 0) (interrupt 1) | |
| 31 | // | |
| 32 | // The two resistors in the circuit are pull-down resistors (so, say 100kΩ). | |
| 33 | // Without them, the Arduino is unable to read the pulse wave at all. | |
| 34 | // | |
| 35 | // Note that your receiver may not send pulses sequentially, in "channel order". | |
| 36 | // If this turns out to be the case, you will need to arrange for the pulses to | |
| 37 | // wire up the channels in an order whereby the pulses alternatively alternately | |
| 38 | // between the two interrupts and adjust the channel order below. | |
| 17
by Tim Marston rc-interface: mostly completed it (untested, but rx and tx code should work) | 39 | // | 
| 40 | // Motor control | |
| 41 | // ------------- | |
| 42 | // | |
| 43 | // | |
| 16
by Tim Marston added (unfinished) rc-interface module to src; added arduino.mk | 44 | |
| 45 | ||
| 46 | #include "config.h" | |
| 47 | #include "receiver.h" | |
| 17
by Tim Marston rc-interface: mostly completed it (untested, but rx and tx code should work) | 48 | #include "motors.h" | 
| 18
by Tim Marston completed (hopefully) the RC interface software | 49 | #include "comms.h" | 
| 16
by Tim Marston added (unfinished) rc-interface module to src; added arduino.mk | 50 | |
| 51 | ||
| 52 | void setup() | |
| 53 | {
 | |
| 54 | Receiver::setup(); | |
| 17
by Tim Marston rc-interface: mostly completed it (untested, but rx and tx code should work) | 55 | Motors::setup(); | 
| 18
by Tim Marston completed (hopefully) the RC interface software | 56 | Comms::setup(); | 
| 57 | ||
| 58 | // led | |
| 59 | pinMode( LED_PIN, OUTPUT ); | |
| 60 | digitalWrite( LED_PIN, LOW ); | |
| 61 | } | |
| 62 | ||
| 63 | ||
| 64 | void flash_led() | |
| 65 | {
 | |
| 66 | static bool on = false; | |
| 67 | on = !on; | |
| 68 | digitalWrite( LED_PIN, on? HIGH : LOW ); | |
| 16
by Tim Marston added (unfinished) rc-interface module to src; added arduino.mk | 69 | } | 
| 70 | ||
| 71 | ||
| 72 | void loop() | |
| 73 | {
 | |
| 18
by Tim Marston completed (hopefully) the RC interface software | 74 | int channel_values[ NUM_CHANNELS ]; | 
| 16
by Tim Marston added (unfinished) rc-interface module to src; added arduino.mk | 75 | |
| 76 | while( true ) | |
| 77 | 	{
 | |
| 18
by Tim Marston completed (hopefully) the RC interface software | 78 | // have we read a whole set of channel values? | 
| 16
by Tim Marston added (unfinished) rc-interface module to src; added arduino.mk | 79 | if( Receiver::read_channels( channel_values ) ) | 
| 17
by Tim Marston rc-interface: mostly completed it (untested, but rx and tx code should work) | 80 | 		{
 | 
| 18
by Tim Marston completed (hopefully) the RC interface software | 81 | // yes, flash led! | 
| 82 | flash_led(); | |
| 83 | ||
| 84 | // send channel values to main board | |
| 85 | Comms::write_channels( channel_values ); | |
| 86 | ||
| 87 | // set motor speeds | |
| 88 | Motors::set_values( channel_values ); | |
| 17
by Tim Marston rc-interface: mostly completed it (untested, but rx and tx code should work) | 89 | } | 
| 18
by Tim Marston completed (hopefully) the RC interface software | 90 | |
| 91 | // update motors | |
| 92 | Motors::update(); | |
| 16
by Tim Marston added (unfinished) rc-interface module to src; added arduino.mk | 93 | } | 
| 94 | } |