Stap 12: Firmware
Het programmeren van de barebone is vrij eenvoudig. Alles wat u nodig hebt is een Arduino Uno met de microcontroller verwijderd (het zal de barebone zien als de controller).
http://Arduino.CC/en/Main/standalone
http://Arduino.CC/en/tutorial/ArduinoToBreadboard
Ik gesoldeerd een kop op de 5V, grond, reset, rx en tx, zodat ik kan aansluiten van mijn sensor Arduino met een Arduino uno met de Atmega chip verwijderd. Op deze manier ik kan de manier waarop ik zou met elke andere Arduino Arduino program.
U moet ook de capacitiveSensor bibliotheek voor de Arduino IDE installeren: http://playground.arduino.cc/Main/CapacitiveSensor?from=Main.CapSense
Uploaden van de firmware
De firmware kan gedownload worden in de bijlagen. De CLS_Sensor_firmware is de firmware die moet worden geüpload naar de capacitieve niveausensor. De CLS_sensor_reader firmware kan worden geüpload naar een ander Arduino en gebruikt om te communiceren met de sensor. De lezer Arduino moet worden aangesloten op de sensor via I2C, met 2 4k7ohm pull-up weerstanden. In de volgende stap zal alle opdrachten die kunnen worden gebruikt worden uitgelegd. U kunt ook stukjes code uit de lezer toe te voegen aan uw eigen code, zodat u gemakkelijk kunt instellen en lees de sensor zonder de functies om zelf te schrijven.
Hoe de code werkt
De sensor werkt vrij ongecompliceerd. Elke N seconden hij neemt nota van de tijd op de timer van de millis(). Dan begint het 100 CapacitiveSensor cycli. Vervolgens meet de tijd opnieuw en wordt afgetrokken van de begintijd van de eindtijd. Dit is de ruwe waarde waarbij de sensor het vloeistofniveau vergelijkt. De sensor maakt ook een 0-255 waarde en een afstand in mm van de ruwe waarde, door te vergelijken met de ingestelde minimale en maximale waarde.
Waarden worden opgeslagen in EEPROM te laten niet-vluchtig. Wanneer de sensor bevoegdheden op, zal het de waarden van de EEPROM leest en start meten.
Ook heeft de sensor een I2C-lijn om te communiceren met een model microcontroller. De I2C adres van de sensor is 42. De kapitein communiceert met de sensor op de volgende manier.
//master request example Wire.beginTransmission(42); //open communication Wire.write(30); //tell the sensor what to do (30 = send raw value) //additional writes can happen in case of 60. Wire.endTransmission(); //end the transmission Wire.requestFrom(42,2); //request 2 bytes from the sensor if(Wire.available()) // if two bytes were received { readValue[0] = Wire.read(); //read the first byte readValue[1] = Wire.read(); //read the second byte }
De opdrachten die kunnen worden verzonden naar de sensor zijn:
- 10: verzenden 0-255 niveau waarde (het resultaat van 1 byte);
- 20: Stuur afstand in mm (geeft als resultaat 2 bytes, eerst de hoge byte, dan de lage byte);
30: rauwe maatregel verzendingstijd (resultaat 2 bytes, eerst de hoge byte, dan de lage byte);
- 40: instellen van de sensor-waarde van de 0% (aanvullende gebeurt er niets);
- 50: instellen van de sensor-waarde van de 100% (aanvullende gebeurt er niets);
- 60: de lengte van de sensor in de eenheid die u wilt instellen (2 extra bytes naar verwachting worden verzonden dat geeft u de lengte van de sensor uw gekozen eenheid)
- 70: Lees de lagere limiet ruwe waarde instellen (2 bytes als resultaat gegeven (hoge byte eerste) met de set lagere ruwe waarde);
80: Lees de ruwe waarde van ingestelde bovengrens (2 bytes als resultaat gegeven (hoge byte eerste) met de ingestelde bovenste ruwe waarde);
- 90: Lees de lengte instellen sensor (2 bytes als resultaat gegeven (hoge byte eerste) met de ingestelde lengte in de eenheid u geplukt)
Een belangrijke bug in Wire.h
De draad bibliotheek is een nieuwsgierig bug daarin heeft als 2 Arduino van communiceren. Wanneer de kapitein een Europese naar de slaaf verzonden heeft, kan de slaaf niet sturen terug op deze manier:
byte sendValue1; byte sendValue2; Wire.write(sendValue1); Wire.write(sendValue2);
In plaats daarvan moet het terugsturen de waarde op deze manier:
byte sendValue[2]; Wire.write(sendValue,2);
Zoniet gedaan op deze manier, de kapitein ziet alleen de laatste byte verzonden, en alle anderen worden genegeerd. Het lijkt misschien eenvoudig, maar deze kwestie hier kostte me 3 dagen om erachter te komen.
!!! 3 DAGEN!!!
(Als het mogelijk was zou ik ook hoofdstad 3 gebruiken).