Outils pour utilisateurs

Outils du site


issue136:great_cow_basic

In FCM#129, I showed you how to use the analog-to-digital conversion (ADC) with a potentiometer, and how to control a LED with pulse width modulation (PWM) with the resulting value of the ADC. In this article, I will show how to use the ADC again, but this time we use a light dependent resistor (LDR) to gather information about the ambient brightness and how to communicate at distance.

Dans le FCM n° 129, j’ai montré comment utiliser la conversion analogique-numérique (ADC - Analog-Digital Conversion) avec un potentiomètre, et comment contrôler une LED par modulation de largeur d’impulsions (PWM - Pulse Width Modulation) avec la valeur résultante de l’ADC. Dans cet article, je montrerai à nouveau comment utiliser l’ADC, mais, cette fois, nous utiliserons une photo-résistance (LDR - Light Dependent Resistor) pour obtenir des informations sur la quantité de lumière ambiante et comment les communiquer à distance.

Light dependent resistor A LDR, or photocell, is a light-controlled variable resistor. The resistance decreases with increasing light intensity. Hence you may use it to develop light-dependent applications to react to changes of the light intensity or the difference between light and dark conditions. In the dark, the LDR has a resistance of many megaohms; when the LDR is in the light, the resistance drops to a few hundred ohms. LDRs are available in different sizes (such as LED, e.g, 3 or 5 mm), and with different electrical resistances. Always review the datasheet, which contains the characteristics of specific LDRs.

Photo-résistance

Une LDR ou cellule photo-électrique, est une résistance variable contrôlée par la lumière. La résistance décroît quand l’intensité de la lumière augmente. Par conséquent, vous pouvez l’utiliser pour développer des applications dépendantes de la lumière pour réagir aux changements de son intensité ou aux différences entre des conditions lumineuses et sombres. Dans le noir, la LDR a une résistance de plusieurs mégaohms ; quand la LDR est dans la lumière, la résistance tombe à quelques centaines d’ohms. Les LDR sont disponibles en différentes tailles (comme les LED, en 3 ou 5 mm) et avec différentes résistances électriques. Lisez systématiquement la notice, qui contient les caractéristiques des LDR particulières.

LDR and the Analog Digital Conversion To use the ADC, we need to know how to connect a LDR to the microcontroller – which seems simple – like any other resistor. But here comes the tricky part: you need a voltage divider to connect it to get useful readings. Therefore, we need some theory before we can operate the LDR correctly. Using Ohms Law, the current which flows through a conductor between two points is directly proportional to the voltage across the two points. To calculate the voltage dividers values, you can use this equation. If we would use resistors with a fixed value of 100 Ohm for resistance, we could set Vin = 5 V, R1 as 100 Ohm and R2 as 100 Ohm and would have a fixed Vout of 2.5 Volts. Next, we assume R1 to be our LDR and assume further it's dark and the LDR has gained its highest resistance of 1 MOhm - then Vout would be 0.45 V. On the other hand, if we set the LDR as R2 and leave R1 at 100 Ohm the voltage would be 4.55 V. As you can see, knowing on which side the LDR resides is important to interpret the measured values. So, first you have to decide where the LDR resides in your circuit. After considering the placement of the LDR, the ADC has to be connected between R1 and R2. The schematic of the circuit looks a bit like a twisted L with a joint to the right side. In the diagram, the Vout would be the connection to the ADC channel on the microcontroller.

Photo-résistance et conversion analogique-numérique

Pour utiliser l’ADC, nous avons besoin de savoir comment connecter la LDR au microcontrôleur - ce qui semble simple - comme tout autre résistance. Mais voici la partie compliquée : vous avez besoin de la connecter à travers un diviseur de tension pour obtenir des lectures utiles. Par conséquent, nous avons besoin d’un peu de théorie avant de pouvoir utiliser la LDR correctement. En utilisant la loi d’Ohm, le courant qui circule dans un conducteur entre deux points est directement proportionnel à la tension entre ces deux points. Pour calculer les valeurs du diviseur de tension, vous pouvez utiliser cette équation. Si vous utilisez des résistances avec une valeur de résistance fixe de 100 ohms, avec une tension Vin = 5 V, R1 valant 100 ohms et R2 100 ohms, nous aurons une sortie Vout fixe de 2,5 Volts. Ensuite, nous faisons les hypothèses que R1 est notre LDR, qu’il fait sombre et qu’ainsi la LDR a atteint sa résistance la plus élevée, 1 Mohm - alors Vout sera de 0,45 V. D’un autre côté, si nous décidons que R2 est la LDR et que R1 reste à 100 ohms, la tension de sortie sera de 4,55 V. Comme vous pouvez le voir, le fait de savoir de quel côté se situe la LDR est important pour interpréter les valeurs mesurées. Aussi, vous devez décider d’abord où se situe la LDR sur votre circuit. Après s’être intéressé au placement de la LDR, l’ADC doit être connecté entre R1 et R2. Le schéma du circuit ressemble un peu à un L tordu avec une liaison sur le côté droit. Dans le diagramme, Vout sera la connexion au canal ADC du microcontrôleur.

Over the air data transmission For the first experiments, I measure some changes of the LDR values by connecting the microcontroller and the LDR with the serial adapter and see how the values change by changing the light levels. Then, as a further development, it is interesting to check the light levels outside the house, to get an idea whether it is dark or not. To gather the data from the outside, a way to transmit the LDR values over air would be great. In the Arduino world, there are some technologies to achieve this: ZigBee, 2.4 GHz, Bluetooth, WLAN, LoRa to name a few. But, for simplicity, we use the cheapest method of wireless data transfer: a 433 MHz transmitter and receiver (for those not living in the EU, it would be 315 MHz). They are really inexpensive, a pair can be obtainable for a few Euros. On the vending platform of your choice, e. g. ebay, you can find them easily, as “Arduino 433 Mhz”, “Arduino 315Mhz” also the keyword “superregenerative” will help, the receiver is called “HX-RM-5V” and the transmitter solely is called “FS1000A”. Make sure you get only those with the plain transmitting / receiving circuits on them. Choose those with or without an antenna, if you do not have an antenna included, you can choose a thin wire. This setup can be unreliable because the data transfer is concurrent with other devices such as weather stations, remote power plugs, and the like. And read the article up to the conclusion if you are about to buy new ones.

Transmission sans fil

Pour les premiers essais, je mesure des modifications de la valeur de la LDR en connectant le microcontrôleur et la LDR avec un adaptateur série pour voir comment les valeurs changent quand la quantité de lumière varie.

Ensuite, comme développement ultérieur, il est intéressant de vérifier le niveau de la lumière hors de la maison, pour avoir une idée s’il fait sombre ou non. Pour récupérer les données depuis l’extérieur, une manière de transmettre sans fil les valeurs de la LDR serait superbe. Dans le monde d’Arduino, plusieurs technologies existent pour le faire : ZigBee, 2.4 GHz, Bluetooth, WLAN, LoRa pour en nommer quelques-unes. Mais, par simplicité, nous utilisons la méthode la moins chère de transfert de données sans fil : un émetteur/récepteur de 433 MHz (pour ceux qui ne vivent pas dans l’UE, ce sera 315 MHz). Ils sont vraiment bon marché, une paire peut être acquise pour quelques euros. Sur la plateforme e-commerce de votre choix, par ex., eBay, vous pouvez les trouver facilement, avec « Arduino 433MHz », « Arduino 315 MHz » ; le mot-clé « superregenerative » peut aussi aider. Le récepteur est appelé « HX-RM-5V » et l’émetteur seul s’appelle « FS1000A ». Assurez-vous de ne prendre que ceux qui ne comportent que les seuls circuits d’émission/réception. Choisissez-les avec ou sans antenne ; si n’avez pas l’antenne incluse, vous pouvez choisir un fil fin. Ce réglage peut s’avérer peu fiable car le transfert des données est en concurrence avec les autres dispositifs comme les stations météo, les prises avec contrôle à distance et équivalents. Et lisez l’article jusqu’à la conclusion si vous êtes sur le point d’en acheter des neufs.

For more important data, it is recommended to use other transfer methods. But, the simplicity with this hardware was intriguing: Just 3 Pins for a wireless data transfer, Vcc, GND and a DATA pin on both the transmitter and the receiver. Another point is the power consumption, transmitter and receiver draw only some mA of power which should give some neat wireless sensor nodes. With respect to the Arduino, there are some libraries to receive and send data over those modules. Multi-purpose: virtualwire, and its successor radiohead, or, for switching power plugs: rc-switch. Great Cow BASIC does not include a demonstration for this type of solution. Most of the demonstration code focuses on modem-like transmitter/receiver and the nrf24L01 (2.4 GHz) module support. So, how to create a simple solution to this problem? I asked myself why not use a plain serial connection?.. this might do the job with ease. After some research, it seems that this idea has been thought through and tested before, so I found proof in some Instructables projects (see links below for more information), and that my idea was feasible.

Pour des données plus importantes, il est recommandé d’utiliser d’autres méthodes de transfert. Mais la simplicité avec ce matériel est étonnante : juste 3 picots pour un transfert de données sans fil, Vcc (alim+), GND (masse) et DATA (données), sur l’émetteur comme sur le récepteur. Un autre point est la consommation électrique : l’émetteur et le récepteur n’absorbent que quelques mA d’alimentation ce qui devrait donner des capteurs ponctuels sans fil soignés. Quant à Arduino, des bibliothèques existent déjà pour l’émission et la réception de données avec ces modules. Multi-usages : virtuawire, et son successeur radiohead, ou, pour commuter des prises d’alimentation : rc-switch. Great Cow BASIC ne dispose pas de démonstration de ce type de solution. La plupart du code de démonstration se focalise sur les émetteurs/récepteurs façon modems et le support du module nrf24L01 (2,4 GHz).

Aussi, comment créer un solution simple à ce problème ? Je me suis demandé pourquoi ne pas utiliser une simple liaison série ? Ceci pourrait sans doute faire le boulot facilement. Après quelques recherches, il semble que cette idée est déjà sortie et a été étudiée avant, comme j’en ai trouvé la preuve dans certains projets Instructables (voir les liens ci-dessous pour plus d’informations) et cette idée était faisable.

Transmission software Using the plain serial connection has another advantage. You do not need major changes to the setup from the early articles I have published in this series. The same program code to send data to the USB serial converter can be used, you would only interchange the connections between the USB serial converter and the transmitter. The following code might look familiar, because the ADC readings of a potentiometer and a LDR are similar, the only changes to the code was to rename the variable from POTI to LDR (code on next page, top right). Put an USB serial adapter with the RX-Line to the TX-Pin of the ATtiny13a, and start your terminal software to see what's going on there. At my site, during writing and testing the software, the surrounding light gives values around 66 - 71, after holding the camera light of my smartphone over the LDR the value increases to a maximum of 216.

Logiciel de transmission

L’utilisation d’une simple connexion série a un autre avantage. Vous n’avez pas besoin de faire de grands changements dans le paramétrage réalisé à partir des articles précédents publiés dans cette série. Le même code de programme pour l’envoi de données au convertisseur série USB peut être utilisé ; vous n’aurez qu’à intervertir les connexions entre le convertisseur série USB et l’émetteur. Le code suivant peut vous sembler familier, car les lectures d’un potentiomètre et d’une LDR avec l’ADC sont similaires ; la seule modification du code fut de renommer la variable POTI en LDR (le code est sur la page suivante, en haut à droite).

Mettez un adaptateur série USB avec la sortie RX sur la borne TX de l’ATtiny13a et lancez votre logiciel de terminal pour voir ce que se passe. Chez moi, pendant l’écriture et le test du logiciel, la lumière ambiante donnait des valeurs entre 66 et 71 ; en tenant le projecteur de l’appareil photo de mon smartphone sur la LDR, les valeurs montaient jusqu’à 216, au maximum.

Trial and Error After replacing the wires and heading over to air transmission, the results were very strange. This was the result for a quick installment: however, after soldering antennas (~ 17 cm) to both the transmitter and the receiver the results of the transmission improved. Achieving 40 cm distance with ‘over the air transmission’ and the quality was acceptable. Most reference articles I found suggest sending the data sometimes more than once. And, for the first test, shown below, this was proven by empirical testing (shown bottom right) The next test configuration was to set the Sender device 1m from the Receiver device. As it turned out, the characteristics of the receiver could not handle the constant data stream the software sent to it every second. The surrounding noise pollutes the data stream. To improve the reception reliability, the software has to be written with the characteristics of the hardware in mind, the simple 433 MHz set used is best used with short bursts of data and not a constant stream of data. Also noteworthy in this article: the Sender device is always on, even when no data is being sent, therefore the transmitter device always has power applied. In many other setups, I found that the transmitter device is switched off after transmit. Either by setting the microcontroller to a powersave status, or by switching the transmitter device over a transistor. So, it is getting a bit tricky to use this technique for a direct microcontroller to serial line connection.

Tâtonnements

Après remplacement de la liaison filaire par une transmission sans fil, les résultats ont paru très étranges. C’était le résultat d’une installation rapide ; cependant, après soudure des antennes (env. 17 cm) de l’émetteur et du récepteur, les résultats de transmission se sont améliorés. Avec une distance de 40 cm pour la « transmission sans fil », la qualité était acceptable. La plupart des articles de référence que j’ai trouvés suggèrent d’envoyer les données plusieurs fois plutôt qu’une. Et, au premier test, montré ci-dessous, ceci fut prouvé par un test empirique (montré en bas à droite).

La configuration du test suivant était d’installer le dispositif émetteur à 1 m de distance du dispositif récepteur. En fait, les caractéristiques du récepteur ne permettaient pas de gérer le flux constant de données que le logiciel lui envoyait toutes les secondes. Le bruit ambiant pollue le flux des données. Pour améliorer la fiabilité de la réception, le logiciel doit être écrit en gardant en tête les caractéristiques du matériel ; cet équipement simple à 433 MHz est mieux utilisé avec de courtes salves, et non pas un flux constant, de données. Un point intéressant dans cet article : l'Émetteur est toujours allumé, même si aucune donnée n’est envoyée ; par conséquent, le dispositif de transmission est toujours sous tension. Dans beaucoup d’autres configurations, j’ai trouvé que le dispositif transmetteur est éteint après transmission. Soit en plaçant le microcontrôleur dans un état d’économie d’énergie, soit en coupant l’alimentation du dispositif de transmission avec un transistor. Aussi, il devient un peu compliqué d’utiliser cette technique avec un microcontrôleur directement utilisé en connexion de ligne série.

Experimentation with Byte transmitted as preambles, as suggested in the research articles, were not of sufficient quality for the readability of the console output. The results were even the same if given a value as 0xFA or given a simple ‘dot’ as preamble. So, I added dots as pre- and postamble. The results on the console for the short range of 40cm to 1m looked promising and the data received was read as in the snippet below. After setting the Sender device to another room (~ 3m and a wall between), the results looked promising the first seconds, but after a while the data got unreadable. Even in the same room (~ 3m, but no walls) left unusable data on the console as in this other snippet (top right) So something was faulty in my code which gave poor results. After careful examination with the timings, the times the LDR values are sent and the last Byte value (Ser1Send 0b00000000) it seems that this last Byte value was too much. After deleting this line and recompiling it, the results (bottom right) were much better.

Une expérience d’envoi de « Byte » (octet) comme préambule, comme suggéré dans des articles de ma recherche, ne fut pas d’une qualité suffisante pour une bonne lecture de la sortie sur la console. Les résultats étaient les mêmes, que le préambule ait une valeur OxFA ou un simple « point ». Aussi, j’ai ajouté des points en préambule et en conclusion. Les résultats sur la console pour une distance entre 40 cm et 1 m parraissaient prometteurs et les donées reçues étaient lues comme dans l’encart ci-dessous.

Après avoir placé le dispositif émetteur dans une autre pièce (environ 3 m et un mur de séparation), les résultats semblaient prometteurs pendant les premières secondes, mais après un moment, les données étaient illisibles. Même dans la même pièce (environ 3 m, mais sans mur) les données de la console restaient inutilisables comme montré dans cet autre encart (en haut à droite).

Ainsi, mon code contenait quelque chose d'erroné qui donnait de mauvais résultats. Après une étude minutieuse des intervalles de temps, les moments où les valeurs de la LDR sont envoyés et la dernière valeur Byte (Ser1Send 0b00000000), il semble que cette dernière valeur de Byte soit de trop. Après suppression de cette ligne et recompilation, les résultats (en bas à droite) étaient bien meilleurs.

Breadboard circuitry To test the software, you might connect the Receiver directly to a USB to serial converter, connect 5V to Vcc, the RX to the DATA pin (only one of them, not both at the same time), and GND to GND. The transmitter device and the LDR should be connected to the ATtiny13a as seen below.

Circuit de la plaque d’essai

Pour tester le logiciel, vous pourriez connecter le récepteur directement au convertisseur série USB, connecter le 5V au Vcc, le Rx à la borne DATA (une seule, pas les deux en même temps) et GND à GND. Le dispositif transmetteur et la LDR devront être connectés à l’ATtiny13a comme montré ci-dessous.

Conclusion The software serial solution from Great Cow BASIC did the job as expected. But, to get reliable results from the over-the-air connection was much more work than I had expected. Testing this little Transmitter outside was out of scope for this time due to my tight time budget. But, for a battery powered solution, I would implement some kind of power saving on the transmitter because sending data every 8 seconds without switching it off would soak up the energy of the most powerful battery soon. The compiled binary has 772 Bytes, so there is some space left to implement maybe a solution with a watchdog timer and a power saving routine can be added. On the hardware side, I maybe would change the receiver on the long run as there might be better solutions for this. Other receivers which were mentioned to work better and are not really more expensive than the used one are “RXB6”, “RXB8”, “RXB12”. If I would buy new hardware, I would maybe test another receiver as it seems that the used one is the one with the poorest reception you can get. The transmitter works fine and seems to have no better candidate.

Conclusion

La solution de logiciel série pour Great Cow BASIC a fait le travail comme prévu. Mais, pour obtenir des résultats fiables avec une transmission sans fil, le travail a été plus long que ce que j’avais prévu. Le test de ce petit transmetteur à l’extérieur était hors sujet pour cette fois-ci du fait du peu de temps qui m'était disponible. Mais, pour une solution alimentée par piles, j'implémenterais une sorte d’économiseur d’énergie sur le transmetteur parce que l’envoi de données toutes les 8 secondes sans coupure d’alimentation absorberait rapidement l’énergie disponible de la plus puissante pile. Le binaire compilé faisait 772 octets ; il y a ainsi assez d’espace restant pour implémenter peut-être une solution avec un « watchdog » (litt., chien de garde - solution de surveillance d’une durée) et une routine de gestion d’énergie pourrait être ajoutée.

Côté matériel, à long terme, je changerais probablement le récepteur, car il pourrait y avoir de meilleures solutions. Les autres récepteurs qui ont été notés comme fonctionnant mieux sans être beaucoup plus chers que celui utilisé sont les « RXB6 », « RXB8 », « RXB12 ». Au cas où j’achèterais du nouveau matériel, je testerais peut-être un autre récepteur, car il semble que celui utilisé est celui qui a la plus mauvaise réception possible. Le transmetteur fonctionne bien et semble ne pas avoir de concurrent meilleur.

For more reliable data transfers, it could be a good idea to implement another algorithm and receive the data first through another microcontroller, there are some suggestions in the references and elsewhere on the internet. Maybe change the transmitter and receiver side to a completely different solution would be another valid option. And, I would definitely add some kind of switching for the transmitter to power it off if no data is to be sent - otherwise your power plug cannot be switched - this project interferes with them. Essentially, it works. The Tiny13a can support LDR and data transmission over the air.

Pour des transferts de données plus fiables, ce serait peut-être une bonne idée d’implémenter un autre algorithme et de recevoir d’abord les données via un autre microcontrôleur ; il y a quelques suggestions dans les références et partout sur Internet. Peut-être qu’un changement des émetteur et récepteur pour une solution complètement différente serait une autre solution valable. Et j’ajouterais sans aucun doute une sorte de sectionnement sur le transmetteur pour couper l’alimentation quand aucune donnée n’est à envoyer - autrement, votre prise d’alimentation ne peut pas être coupée - ce projet interfère avec eux.

En gros, ça marche. Le Tiny13a peut supporter une LDR et une transmission de données sans fil.

Sources If you want to download the sources instead of copy-pasting it, you can now check it out with git or an SVN client. Have a look at https://github.com/Anobium/Great-Cow-BASIC-Demonstration-Sources/tree/master/Publication%20Solutions/Full%20Circle for more information.

Sources

Si vous voulez télécharger les sources plutôt que de les copier/coller, vous pouvez les récupérer avec git ou un client SVN. Regardez à https://github.com/Anobium/Great-Cow-BASIC-Demonstration-Sources/tree/master/Publication%20Solutions/Full%20Circle pour plus d’information.

References Good introduction on voltage divider circuits https://learn.sparkfun.com/tutorials/voltage-dividers/ideal-voltage-divider Explanation about 433 / 315 Mhz receivers and transmitter, virtualwire library https://www.pjrc.com/teensy/td_libs_VirtualWire.html Simple transmit over 433 Mhz modules, using the USART - part 1 https://www.instructables.com/id/Wireless-Communication-Using-Cheap-433MHz-RF-Modul/ Simple transmit over 433 Mhz modules, using the USART - part 2 https://www.instructables.com/id/Wireless-Communication-Using-Cheap-433MHz-RF-Modul-1/ Tips for enhancement of the use of the 433 Mhz modules and a suggestion for a own transfer protocol http://www.romanblack.com/RF/cheapRFmodules.htm

Références

Une bonne introduction aux circuits diviseurs de tension : https://learn.sparkfun.com/tutorials/voltage-dividers/ideal-voltage-divider

Une explication à propos de la bibliothèque virtualwire pour les récepteurs et transmetteurs 433 / 315 MHz : https://www.pjrc.com/teensy/td_libs_VirtualWire.html

Une transmission simple avec des modules 433 MHz, utilisant l’USART - partie 1 : https://www.instructables.com/id/Wireless-Communication-Using-Cheap-433MHz-RF-Modul/

Une transmission simple avec des modules 433 MHz, utilisant l’USART - partie 2 : https://www.instructables.com/id/Wireless-Communication-Using-Cheap-433MHz-RF-Modul-1/

Astuces pour l’amélioration de l’usage des modules 433 MHz et une suggestion pour son propre protocole de transfert : http://www.romanblack.com/RF/cheapRFmodules.htm

Acknowledgement I wish to thank Evan Venn (Anobium) from the Great Cow BASIC Team for his insights and valuable hints.

Remerciements

Je souhaite remercier Evan Venn (Anobium) de l’équipe Great Cow BASIC pour ses idées et ses précieuses indications.

issue136/great_cow_basic.txt · Dernière modification : 2018/09/23 11:54 de andre_domenech