Étape 12 : Firmware
Le barebone de programmation est assez simple. Tout ce dont vous avez besoin est un Arduino Uno avec le microcontrôleur supprimé (il verra le barebone comme contrôleur).
http://Arduino.cc/en/main/standalone
http://Arduino.cc/en/Tutorial/ArduinoToBreadboard
J’ai soudé un en-tête au 5V, sol, réinitialisation, rx et tx, donc je peux me connecter Arduino de mon capteur à un Arduino uno qui a la puce Atmega supprimée. De cette façon je peux programmer l’Arduino la façon dont je le ferais avec n’importe quel autre Arduino.
Vous devrez également installer la bibliothèque capacitiveSensor à l’IDE Arduino : http://playground.arduino.cc/Main/CapacitiveSensor?from=Main.CapSense
Télécharger le firmware
Le firmware est téléchargeable dans les pièces jointes. Le CLS_Sensor_firmware est le firmware qui a besoin d’être téléchargés sur le capteur de niveau capacitif. Le firmware de CLS_sensor_reader peut être transféré à un autre Arduino et utilisé pour communiquer avec la sonde. Le lecteur Arduino doit être raccordé à la sonde à travers l’I2C, avec 2 résistances de pull-up 4k7ohm. Toutes les commandes qui peuvent être utilisés seront expliquées dans l’étape suivante. Vous pouvez également utiliser des extraits de code à partir du lecteur d’ajouter à votre propre code, vous pouvez facilement définir et lire le capteur sans avoir à écrire les fonctions vous-même.
Comment fonctionne le code
Le capteur fonctionne assez simple. Toutes les N secondes, il consigne l’heure sur l’horloge de millis(). Puis il commence à 100 cycles de CapacitiveSensor. Ensuite, il mesure le temps nouveau et soustrait de l’heure de début de l’heure de fin. Il s’agit de la valeur brute par lequel le capteur compare le niveau de liquide. Le capteur permet également une 0-255 valeur et une distance en mm de la valeur brute, en le comparant à l’ensemble minimal et la valeur maximale.
Valeurs sont stockées en EEPROM pour les rendre non volatile. Quand le capteur se mette, il va lire les valeurs de l’EEPROM et commencer à mesurer.
Le capteur a également une ligne I2C pour communiquer avec un microcontrôleur maître. L’adresse I2C du capteur est 42. Le capitaine communique avec le capteur de la manière suivante.
Les commandes peuvent être envoyées à la sonde sont :
- 10 : une valeur de niveau d’envoi 0-255 (retourne 1 octet) ;
- 20 : envoyer la distance en mm (renvoie tout d’abord 2 octets, l’octet haut, puis l’octet de poids faible) ;
30 : envoi des temps de mesure brute (renvoie tout d’abord 2 octets, l’octet haut, puis l’octet de poids faible) ;
- 40 : valeur de 0 % de capteur (supplémentaires ne se passe rien) ;
- 50 : capteur 100 % valeur (supplémentaires ne se passe rien) ;
- 60 : définir la longueur du capteur dans l’unité de votre choix (2 octets supplémentaires devraient être envoyées qui spécifient la longueur de la sonde de votre unité choisie)
- 70 : lire la valeur brute set pour la limite inférieure (retourne 2 octets (octet haut premier) avec le jeu de baisser en valeur brute) ;
80 : lire la valeur brute de la limite supérieure fixée (retourne 2 octets (octet haut premier) avec la valeur brute supérieure) ;
- 90 : lire la longueur de l’ensemble capteur (retourne 2 octets (octet haut premier) la longueur définie dans l’unité que vous avez choisi)
Un bug important dans Wire.h
La bibliothèque de fils est comporte un bug curieux lorsque l’Arduino 2 communiquent. Lorsque le capitaine a envoyé un requestFrom à l’esclave, l’esclave ne peut pas renvoyer cette façon :
Au lieu de cela, il doit renvoyer la valeur de cette façon :
Si ce n’est fait de cette façon, le maître ne verrez que le dernier octet envoyé, et tous les autres sont ignorés. Cela peut sembler simple, mais cette question ici m’a coûté 3 jours pour comprendre.
!!! 3 JOURS!!!
(S’il était possible que j’utiliserais aussi capital 3).