Arduino

Deze pagina gaat over de makkelijke Arduino Nano (8-bits Atmel) 'bouwsteentjes' waarmee je snel simpele besturingen in elkaar kunt setten, en vergelijkbare bordjes als de Wemos D1 mini: een Arduino-compatibel WiFi bordje met de ESP8266, een 32-bits processor.

Project-pagina's met complete projecten:

Arduino Nano

De Arduino Nano is een klein bordje met de Atmel ATmega328, gemaakt door Arduino. Heeft meer mogelijkheden en gebruiksgemak dan de ATtiny die ik veel heb gebruikt, en omdat het een kant-en-klare module is zit ik niet met een chip die lastig te solderen is... Nano op mijn handBovendien, heeft een USB-aansluiting waardoor er geen aparte programmer nodig is, zoals bij mijn ATtiny, en past mooi op experimenteerbordjes. Bedankt, Arduino!

Kleiner dan de gebruikelijke Arduino's als de Uno, en je kan geen 'shields' gebruiken, maar dat had ik voor mijn doel niet nodig. Iets minder low power dan de low-power ATtiny oplossing (door de voeding-LED en zo), maar gebruikt nog steeds minder dan 10 mA bij 5 Volt.

Je kan de Nano in C/C++ programmeren, maar je kan beter met behulp van de Arduino IDE zogeheten 'sketches' maken (in een dialect van C++), omdat je dan gebruik kan maken van veel kant-en-klare bibliotheken als voor I2C, LCD's, en zo voort. Zie hieronder bij configuratie wat tips over instellingen. Met behulp van de 'Arduino getting started' gids: bij het doorlopen van de stappen en het uploaden van de Blink sketch (een van de meegeleverde voorbeelden) werkte het in een keer goed: de LED knippert!

ATmega328

De processor op de Nano is iets zwaarder dan de ATtiny die ik veel gebruikte:

  • 32Kbyte Flash prgrammageheugen
  • 1Kbyte EEPROM datageheugen
  • 2Kbyte RAM geheugen
  • 8 analoge ingangen
  • 6 PWM uitgangen
  • Seriële poort, I2C, SPI, etc
  • 20 MHz (16 voor de Nano)
  • Voeding 1.8 - 5V

Waarom een ouderwetse 8-bitter, en niet een simpele ARM M0 32-bit als de LPC8xx? Ik wilde snel iets kunnen maken, en dan zijn de grote gebruikersgroep, de eenvoudig gehouden IDE en de beschikbare voorbeelden/libraries van de Arduino-omgeving een voordeel, al is de processor zelf dan niet meer het modernste... Onderstaand LCD/sensor-voorbeeld had ik in een uurtje in elkaar, zonder van te voren de ontwikkelomgeving te kennen. Ondertussen zijn er ook 32-bit processoren met Arduino-support, zie verderop de ESP8266-bordjes.

Nano Pinout

Let op, de 5V en de 3V3 (3.3 Volt) zijn uitgangen; voeden via de VIN of via USB!

Arduino Nano Pinout

ESP8266 WiFi bordjes

De ESP8266 chip van Expressif (en de recentere ESP32) is erg populair op het moment, en hoewel de bordjes met deze chips niet van Arduino komt, is het wel compatibel met de ontwikkelomgeving (Arduino ontwikkelomgeving versie 1.8 of hoger). Je moet wel het juiste 'board support package' geladen hebben: zie de meest recente versie op de ESP8266 Github. Veel bordjes mee verkrijgbaar, met typisch:

Thanks!
Blij met Arduino? Doe eens een gift (downloadpage).
  • Standaard WiFi, dankzij de ESP8266 chip van Expressif. De benodigde software libraries zitten in de Arduino omgeving meeverpakt.
  • WiFi b/g/n, WEP of WPA/WPA2 authenticatie (of geen wachtwoord)
  • De ESP8266 heeft een 32-bits processor core (Tensilica L106) op 80 MHz, en veel meer werkgeheugen (ongeveer 50 Kbyte vrij, plus een 4 Mbit = 512 Kbyte Flash chip)
  • Goedkoop, bijvoorbeeld onderstaande Wemos voor €6,50 bij TinyTronics in Nederland, maar als je geen haast hebt krijg je ze in China goedkoper
  • Is onderdeel van een uitgebreide serie bordjes met de ESP8266 (ook de Home Control Sonoff 220V WiFi schakelaar is hierop gebaseerd).
  • Nadeel: meer stroomgebruik, zeker 140 mA bij ontvangen, en meer bij zenden
  • Nadeel: minder I/O dan een Arduino: 11 digitale input/output pinnen, met interrupt/PWM/I2C/one-wire support (behalve op D0), 1 analoge input
  • Meer informatie: zie de ESP8266 Wikipedia pagina.

Er is overigens al een nieuwere versie uit (waar ik zelf nog geen ervaring mee heb): de ESP32. Deze heeft onder andere ook Bluetooth.

WEMOS D1 mini

WeMos D1 Mini V3 op breadboard
Wemos op breadboard, met LED en schakelaar.
Links de USB aansluiting/voeding.

December 2017: vanavond de Wemos D1 mini binnengekregen, gelijk maar eens proberen. Al met al een leuk bordje voor projecten die wat meer eisen dan een 8-bits Nano. Zie de pin-out hieronder, en/of het schema van de WeMos mini (oude versie). On-board antenne, dus niet vreselijk gevoelig (maar ook niet slecht).

De WEMOS D1 mini kan je dus met de Arduino ontwikkelomgeving gebruiken. Er wordt gezegd dat je ook de driver voor de seriële poort moet installeren (niet de standaard FTDI, maar die voor de CH340G chip), maar onder Linux/Ubuntu 16.04 werd de driver automatisch herkend bij het aan de USB hangen van de D1 mini (bij mij als poort ttyUSB0). Snelle test: kies in de Arduino omgeving onder Tools voor de 'WeMos D1 R2 & mini', dan bij File voor Examples --> ESP8266 --> Blink. Dan Sketch --> Upload, en de blauwe LED gaat knipperen!

Hier goede documentatie van de ESP8266WiFi library, niet alleen van de WiFi maar ook van de pinout, het Flash file systeem, de I2C/SPI etc.

Volgende stap is natuurlijk WiFi testen... Heb ik gedaan met de code van de ESP8266 tutorial op diyhacking (alleen hoofdstuk "Uploading the ESP8266 Code", en de LED zit al op het bordje). Hiermee wordt op de Wemos een simpele webserver gezet, zodat je via een webpagina op je PC of telefoon de LED op de Wimos aan en uit kunt zetten. Na het invullen in de code van de naam en wachtwoord van mijn Wifi, de zaak compileren, en uploaden: op de seriële monitor van de Arduino omgeving (Tools --> Serial Monitor, snelheid op 115200 zetten) was te zien dat de Wimos netjes een IP adres had gekregen. Helaas, vanaf de browser kon ik dat adres niet benaderen... Maar, na een reset van de Wimos en het nog eens proberen, werkte het wel. Kreeg een simpele webpagina te zien, met daarop twee links, een om de LED aan te doen, en een om hem weer uit te doen. Perfect, goed besteed uurtje. Een foutje: 'LED aan' zette hem uit, en omgedraaid. Vermoedelijk omdat de source bedoeld was voor een ander bordje (ESP-01), waarbij de LED anders is aangesloten dan op de mini. Ach, het werkt, genoeg voor vandaag. Tevreden.

Wemos D1 mini V3 pinout

Let op, pin out is net weer wat verschillend vergeleken met sommige andere ESP8266 bordjes...

Pin Function ESP-8266 Pin   Pin Function ESP-8266 Pin
RST Reset RST   TX TXD GPIO1
A0 Analog input, max 3.3V A0   RX RXD GPIO3
D0 IO (geen interrupt!) GPIO16   D1 IO, I2C SCL GPIO5
D5 IO, SPI SCK GPIO14   D2 IO, I2C SDA GPIO4
D6 IO, SPI MISO GPIO12   D3 IO, 10k Pull-up GPIO0
D7 IO, SPI MOSI GPIO13   D4 IO, 10k Pull-up, BUILTIN_LED GPIO2
D8 IO, 10k Pull-down, SPI SS GPIO15   G Ground GND
3V3 3.3V 3.3V   5V 5V

Serial WiFi met ESP-07

Nog een bordje met de ESP8266: de 'Serial WiFi v1.0', een printje met de Ai-Thinker ESP-07 module: met mogelijkheid om een aparte WiFi-antenne op aan te sluiten. Bedoeld om een normale Arduino van WiFi te voorzien (als een soort modem), maar kan dus ook zelfstandig gebruikt worden als een ESP8266 bordje.

Probleem is alleen dat er geen headers of zo op zitten, alleen maar twee pinnen voor senden/ontvangen (Tx/Rx) naar een Arduino. Als je het (als een Wemos) zelfstandig wilt gebruiken kan je het niet makkelijk op een breadboard aansluiten maar je moet direct aan de kleine soldeer-eilandjes van de ESP-07 solderen. Dat is voor mij geen probleem. Aan de andere kant, kan wel vanuit 5 Volt gevoed worden, en heeft verder aardig dezelfde mogelijkheden als de Wemos, is alleen goedkoper, en heeft dus de mogelijkheid tot 'echte' WiFi-antenne. Mooi voor als je iets eerst op de Wemos wilt ontwikkelen, en dan in wilt bouwen met dit printje.

Configuratie

Ik werk met Ubuntu/Linux en heb de Linux 64-bit IDE van de Arduino site gehaald. Daarna installeren en als test de eerste sketch draaien: het laten knipperen van de LED, zie de 'Arduino getting started' gids voor Linux. Kies voor het bord uiteraard de 'Arduino Nano' (met de 'ATmega328' processor, in mijn geval de versie met de oude bootloader). Voor de poort moest ik in mijn geval kiezen voor /dev/ttyUSB0. Ik had mezelf al toegevoegd aan de groep dialout (zie hoofdstuk 9 in de getting started gids).

Processor-selecties

De processor-instellingen onder Tools (mijn defaults):

Board Board Processor / Flash Programmer/Poort
Nano Arduino Nano ATmega328P (Old Bootloader) USBasp, /dev/ttyUSB0
SerialWifi Generic ESP8266 Module 1 M (64K SPIFFS) USBasp, /dev/ttyUSB0
Sonoff Generic ESP8285 Module 1 M (64K SPIFFS) USBasp, /dev/ttyUSB0
Wemos D1 LOLIN(WEMOS D1 R2 & mini) 4 M (64K SPIFFS) USBasp, /dev/ttyUSB0
USB ATtiny85 Digispark (Default - 16.5Mhz)
Micronucleus

Seriële poort en udev rules

Voor de poort moest ik in mijn geval kiezen voor /dev/ttyUSB0. Ik had mezelf al toegevoegd aan de groep dialout (zie hoofdstuk 9 in de getting started gids). Op sommige Linux-systemen duikt de Arduino niet altijd op dezelfde poort op, zeker niet als je meerdere seriële devices hebt: wordt het dan /dev/ttyUSB0 of /dev/ttyUSB1? Wil je dit vastzetten, maak dan een 'udev rule' aan. 'udev' is de service die devices registreert in de /dev directory (en ook applicaties kan draaien als je een device inprikt). Je kan dit systeem uitbreiden met eigen regels. Een plezierige uitleg vond ik 'Hardware Hump Day: USB Device Rules on Raspberry Pi' (Engels).

Aan de hand van die uitleg: mijn Arduino Nano maar eens ingeprikt, en met dmesg en udevadm gekeken als welk device deze zichtbaar werd: /dev/ttyUSB0. Dan een regel toevoegen aan de udev rules aan de hand van de gevonden waardes, in een file 51-arduino.rules in de /etc/udev/rules.d/ directory. udev laten herladen (is dat wel nodig?) en ja, er is een /dev/ttyArduino bijgekomen; een symbolische link die in dit geval wijst naar ttyUSB0!

dmesg ; # en kijk welk device er net bijgekomen is: ttyUSB0
udevadm info -a -p  $(udevadm info -q path -n /dev/ttyUSB0)
sudo nano /etc/udev/rules.d/51-arduino.rules
# ACTION=="add", ATTRS{idProduct}=="7523", ATTRS{idVendor}=="1a86", SYMLINK+="ttyArduino"
sudo udevadm control --reload-rules && sudo udevadm trigger --action=add
ls /dev/tty*

Minicom commando's

De basis-commando's:
^a B : scrolling back in buffer
^a Q : quit (no reset)
^a X : eXit and reset
^a Z: help

Met deze rule kan je met minicom ook makkelijk de seriële output van de Arduino opvangen. PS: dit werkt allemaal zowel op mijn laptop onder Ubuntu als op de Raspberry.

minicom -b 115200 -o -c on -D /dev/ttyArduino

Projecten

Nano: De eerste software

Nano met 16x2 LCD display
Prototype bordje met Arduino, display en temperatuur

Februari 2016: Een van de projecten die ik nog wil doen is een thermostaat om 'Sous-Vide' te kunnen koken. Een ATtiny is voldoende, maar op de Nano kan ik sneller een prototype maken. Wat wil ik aansluiten: een LCD display, een temperatuursensor, en een 220V optisch gekoppeld Solid State Relais. En dan een software PID-regelaar voor een mooie constante temperatuur.

Eerst het aansluiten van een 16x2 LCD'tje, wat ik uit eerdere experimenten nog had liggen. Ook hier is er een kant-en-klaar software voorbeeld in de Arduino ontwikkelomgeving dat ook nog eens compatibel is met mijn display: 'Hello World' (kijk bij File -> Examples -> LiquidDisplay -> HelloWorld). Alleen, hoe sluit je de pinnen aan? Daarbij heeft het bovenstaand Nano Pinout-diagram geholpen. De pinnummers zoals in de sketches worden gebruikt zijn daar de paarse nummers (staan ook op de print). Ook op LiquidCrystal Library staat uitleg. Van het display had ik documentatie, en dan is het een kwestie van 9 draadjes stuk voor stuk zorgvuldig aansluiten.

Volgende stap: de I²C temperatuursensor... Ik heb al eerder op de Raspberry de LM75BD temperatuursensor van NXP gebruikt, beviel prima. Op Tutorial: Arduino and the I2C bus staat heel wat over hoe op de Arduino met de Wire library I2C-devices uit te lezen. De daar gebruikte CN75 is compatibel met de LM75BD, alleen slechts met 0.5 graden resolutie. 4 draadjes (5V, GND, clock en data). Op de foto links (aan de dikke rode 'draad') zit de LM75BD.

Na dit eerste spelen is het in februari 2018 (en na andere projecten zoals onderstaande oven-sturing) eindelijk tot een werkend project gekomen, zie mijn Sous-Vide kookapparaat.

Eindresultaat van de ovencontroller
En zo ziet de ingebouwde oven-controller er uit
(teruggeplaatst in mijn oude kastje).
Display: "E=10", energieniveau 10 van de 16.

Nano: Keramiek-oven

Vanwege de grootte van dit projectje is het naar een aparte pagina verhuisd. Zie mijn Arduino Nano Oven-controller pagina (en het plaatje rechts) voor het resultaat.

Wemos en MQTT

Uiteindelijk is het de bedoeling dit in te zetten voor domotica/home automation. Daarvoor wil ik de LED aan en uit kunnen zetten via de mosquitto MQTT broker op mijn Raspberry. Gelukkig is ook hier een goede Arduino library beschikbaar, PubSubClient. Hiermee kon ik vrij snel een twee-richtingen link maken tussen de blauwe LED op de Wemos en de MQTT Dash op mijn tablet, en kan ik de LED nu via een icoontje op de Dash aan en uit schakelen. De LED schakelen gaat ook met een schakelaar aan de Wemos, waarbij dit weer aan de MQTT server doorgegeven wordt, en de status op mijn tablet wordt bijgewerkt. Totaal nog geen 200 regels source; inclusief commentaar en zo. Weer een stap verder!

De eerste tests kunnen gewoon met alleen de Wemos aan een USB-kabeltje. Wil je wat meer testen dan is een simpel breadboard handig. Het plaatje verder naar boven toont de 'proefopstelling' waarbij ik naast de schakelaar ook nog een extra rode LED heb aangesloten op D5/GPIO14. Met de PWM-functie kan ik deze via MQTT/internet dimmen.

Wel nog een klein puntje: bij de ESP8266 wordt timer1 al gebruikt door de WiFi stack... Dus niet de Arduino TimerOne library gebruiken. Ik gebruik zelf nu de Ticker library van ESP8266, was voor deze toepassing ook voldoende.

Sonoff lichtschakelaar

MQTT Dashboard
Android MQTT Dash, met de kerstboom op de Sonoff1 module

Sonoff S20De tijdschakelklok voor de kerstboom was kapot, wat nu? De Sonoff is een goedkope kant-en-klare module om via Wifi 230V te schakelen. Kost vanuit China rond €5 voor een blokje met schroefaansluitingen, en €8..10 voor de S20 stekker-versie rechts. Intern ook met de ESP8266 (of eigenlijk de ESP8285 met 1 MB Flash), en dus herprogrammeerbaar met de Arduino-omgeving. De standaard geleverde software kan natuurlijk ook, maar die werkt voor zover ik weet alleen met een externe IoT server, en dat heb ik liever in eigen hand: via een mosquitto MQTT server op mijn Raspberry. Had natuurlijk ook voor ESPeasy kunnen gaan (Youtube), maar gezien mijn ervaring met de Wemos leek het me leuker het zelf te doen. Hoe moeilijk kan het zijn ;-) ... Zie mijn SonoffMQTT code op Github.

De applicatie die ik al had op de Wemos kon ik vrij snel overzetten, moest alleen de GPIO-nummers aanpassen: het relais zit op GPIO12, de led op GPIO13, en de drukschakelaar op GPIO0. Voor het 'flashen' van de software moet je wel eerst een 5-pins header op de Sonoff solderen (4-polig voor de S20 zoals rechts aangegeven; pas op: de S26 heeft geen makkelijke mogelijkheid voor een header). Dan via een USB-to-serial kabeltje en aanpassing van 5 Volt naar de benodigde 3.3 Volt aansluiten op je computer. De Arduino-omgeving kan vervolgens naar de Flash op de Sonoff uploaden: wel bij aanzetten het knopje ingedrukt houden on in programming mode op te starten (Arduino setting: 'Generic ESP8285 module', geheugen 1 MB Flash met 64 KB SPIFFS, 26 MHz Xtal/80MHz CPU, USBasp programmer). Loskoppelen, Sonoff kastje er weer om heen (gesoldeerde header kan blijven zitten!), en aansluiten op lichtnet/lamp. Nu heb ik een WiFi-bestuurbare schakelaar!

Sonoff programmer
FDTI USB-to-serieel; 5 Volt naar 3.3 Volt niveau's, en dan de binnenkant van de
Sonoff (schroef-versie) met de daarop gesoldeerde 5-pin header: programmeren!

Via bijvoorbeeld MQTT Dash op mijn telefoon en tablet, en een Python-scriptje op de Raspberry, kan ik nu de tijden voor de kerstboomverlichting instellen; zie de interface links (Sonoff1). Kan de kerstboom ook handmatig schakelen door op het lamp-symbool te klikken. Je ziet ook aan het symbool of de verlichting aan of uit staat, wordt via MQTT allemaal real-time aan elkaar gelinkt. En ook het drukknopje op de Sonoff werkt nog als aan/uit schakelaar, en geeft ook real-time de status weer door naar MQTT.

IoT Energieverklikker

Om je bewust te worden van je energiegebruik is het handig gelijk 'feedback' (terugkoppeling) te krijgen: je ziet wat je gebruikt. Ik heb daarom een 'IoT'-lampje gemaakt dat op ieder moment door de kleur weergeeft wat je energiegebruik op dat moment is. Gebruik je veel energie, dan wordt het rood, leveren je zonnepanelen veel op dan wordt'ie blauw-groen, en een heel kleurenpalet daar tussenin. Zie de plaatjes en beschrijving op de Energieverklikker-pagina.

Skype4Business Mute knop

Digispark
DigiSpark USB module

Ik gebruik op het werk nogal eens Skype for Business, en dan wil ik tijdens een gesprek makkelijk de microfoon aan en uit kunnen zetten (mute). Dit kan via de muis, of met Win-F4. Maar, ik wil gewoon een losse knop met LED, voor op het midden van de vergadertafel. Dat kan met de Digispark: die kan een HID (Human Interface device) nadoen: bijvoorbeeld een keyboard. En kan dus ook een Win-F4 verzenden!

En verder

Links naar algemene info

Nuttige libraries etc

ESP8266

Wat random links over de ESP8266, integratie in Arduino, en de Wimos D1 mini