Arduino

Deze pagina is (in aanmaak) voor de Arduino serie zoals de Arduino Nano (8-bits Atmel), en vergelijkbare bordjes als de Wemos D1 mini (Arduino-compatibel WiFi bordje met de ESP8266, een 32-bits processor).

Arduino Nano

De Arduino Nano is een klein bordje met de Atmel ATmega328. Heeft wat 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 waarmee er geen aparte programmer nodig is, zoals bij mijn ATtiny. 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 nog steeds minder dan 10 mA.

Je kan de Nano in C/C++ programmeren, of met behulp van de Arduino IDE zogeheten 'sketches' maken. Heb in eerste instantie even voor de laatste stap gekozen. 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, zie de 'Arduino getting started' gids voor Linux. Kies voor het bord uiteraard de 'Arduino Nano' (met de 'ATmega328' processor). 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), dus 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 meestal 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 of een 32-bit Arduino? Ik wilde snel iets kunnen maken, en dan zijn de grote gebruikersgroep, de eenvoudig gehouden IDE en de beschikbare voorbeelden/libraries van de 8-bit AT-processoren 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.

Nano Pinout

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

Arduino Nano Pinout

WEMOS D1 mini

December 2017: vanavond binnengekregen, en gelijk maar eens proberen. De Wemos D1 mini is een bordje dat niet van Arduino komt, maar wel compatibel is met de ontwikkelomgeving (als je het juiste board support package geladen hebt). Dit bordje heeft een paar leuke punten, vergeleken met de 'gewone' Arduino bordjes:WeMos D1 Mini V3

  • Het heeft standaard WiFi b/g/n, dankzij de ESP8266 chip van Expressif. De antenna zit op het bordje (dus niet erg gevoelig)
  • Goedkoop, in mijn geval de V3 voor €6,50 bij TinyTronics in Nederland, maar als je geen haast hebt krijg je ze in China goedkoper
  • Er zit een 32-bits processor op (Tensilica L106) op 80 MHz, en veel meer werkgeheugen (ongeveer 50 Kbyte vrij, plus een 4 Mbit = 512 Kbyte Flash chip)
  • Is onderdeel van een uitgebreide serie bordjes met de ESP8266 (ook de Home Control Sonoff 220V WiFi schakelaar is hierop gebaseerd).

Al met al een leuk bordje voor projecten die wat meer eisen (ook qua stroom overigens, zeker 140 mA bij zenden). Wel wat minder I/O pinnen, zie het schema van de WeMos mini (oude versie): 11 digitale input/output pinnen, met interrupt/PWM/I2C/one-wire support (behalve D0), 1 analoge input.

Ook de WEMOS D1 mini kan je dus met de Arduino ontwikkelomgeving (versie 1.8 of hoger) draaien. Hiervoor moet je wel eerst de board manager voor de ESP8266 installeren, zie de meest recente versie op de ESP8266 Github. 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 (en gekoppeld aan poort ttyUSB0). Kies dan in Arduino 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 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

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. Gelukkig is ook hier een goede Arduino library beschikbaar, PubSubClient. Hiermee kon ik vrij snel een twee-richtingen link maken tussen de 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. Dit 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; inclusef commentaar en zo. Weer een stap verder!

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.

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

Sonoff

De Sonoff is een goedkope (rond €5) kant-en-klare module om via Wifi 230V te schakelen. Intern ook met de ESP8266, en 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 ;-)

De applicatie die ik had op de Wemos kon ik vrij snel overzetten, alleen de GPIO-nummers aanpassen: relais op GPIO12, led op GPIO13, en de drukschakelaar op GPIO0. Via een USB-to-serial kabeltje kan de Arduino omgeving vervolgens de Flash op de Sonoff schrijven (setting: Generic ESP8266 module, 1 MB Flash met 64 KB SPIFFS). Nu heb ik een bestuurbare schakelaar! Via bijvoorbeeld MQTT Dash op mijn telefoon en tablet kan ik nu de tijden voor de kerstboomverlichting instellen; zie de interface hiernaast (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, en geeft ook weer real-time de status door via MQTT.

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

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. Daarnaast is de regeling van mijn keramiek-oven aan een update toe, zie verderop.

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 onderstaand Nano Pinout-diagram geholpen. De pinnummers zoals in de sketches worden gebruikt zijn daar de paarse nummers helemaal links (en 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 compatible 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.

Nano: Keramiek-oven

Keramiek-oven controller met de Arduino nano
Concept-schema (uiteindelijke schema is hier en daar wat anders)

Zoals al gemeld, mijn regelaar voor mijn keramiek-oven mocht wel eens een update gebruiken. Het was een schakeling met discrete logica en een draaiknop voor het energieniveau. In plaats daarvan is het nu meer als in mijn plaatje hiernaast, met een 4-cijferig display voor temperatuur (tot 1250 graden) en enkele drukknopjes voor de invoer. De Arduino nano zorgt voor de tijd, programma-stap en zo voort. Op die manier hoef ik de oven niet meer zelf in de gaten te houden, maar neemt de Nano het stappenplan (zoals in de grafiek onderaan de pagina over de oude controller) over. Dat was het idee; nu de uitvoering...

Volgende stap is het opzetten van voorlopige hardware om de software te kunnen maken. Weer het prototype-bordje zoals hierboven, plus het display, een bordje met knopjes dat ik nog had liggen, en een LED in plaats van de SSR waarmee ik kan zien wanneer en hoe hard de oven aanstaat. Dit is nog een versie zonder temperatuurmeting: eigenlijk de oude regeling maar dan met een automatisch afspelende programma's voor verschillende temperaturen.

Oven controller prototype
Prototype board met de eerste opzet
Display: "P=01", programma 1.

Display (€3 bij dx.com) is toch niet echt I2C-compatible... Dus toch maar op twee andere pinnen aansluiten. Gelukkig heeft 'avishorp' al een goede Arduino library voor de TM1637 geschreven: werkt in een keer, en in de zip download zit ook de English datasheet (niet alleen de Chinese versie)! Dankzij het 'character designer' spreadsheet van JosePino kan ik ook tekst makkelijk weergeven, niet alleen getallen.

Knopjes uitlezen is makkelijker, zitten direkt op de I/O pinnen. Waar je wel op moet letten is de 'contact-dender'; schakelaars en drukknoppen kunnen met indrukken een paar keer 'stuiteren' en dus in korte termijn meerdere pulsjes geven. Ik los dit op door ze meerdere keren te lezen (met een kleine pauze er tussen), en pas een signaal te geven als de waarde stabiel is.

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

Voor de veiligheid heb ik ook de watchdog-timer gebruikt: als de processor crasht (niet vanwege een softwarefout, maar door bijvoorbeeld spanningspieken tijdens het schakelen) schakelt de oven automatisch na twee seconden uit... Safety first!

Het geheel is vrij compact (eigenlijk alleen een nieuw frontje met 2 cm elektronica er achter, het prototype bordje zelf is uiteraard niet ingebouwd), en ik heb het weer in mijn oude kastje terug kunnen plaatsen, de voeding en het SSR is hergebruikt. Moest wel een nieuw frontje maken uit een stukje plexiglas dat ik nog had.

De 50Hz op INT0 is op het proto-board nog niet aangesloten, in plaats daarvan gebruik ik de TimerOne library om 50Hz te genereren (maakt het testen makkelijker). In de uiteindelijke software test ik tijdens het opstarten of er van buitenaf 50 Hz binnenkomt (want gaat de interrupt-teller omhoog), zo niet dan maak ik zelf de 50 Hz met de timer; zie de voorbeeldcode hieronder.

In de interrupt routine zelf (hier niet weergegeven) gebeurt overigens meer dan alleen het ophogen van de teller, zo worden ook de toetsen hier gelezen en verwerkt, wordt de tijd bijgehouden en wordt het Solid State Relais aan- en uitgezet.

// Externe interrupt op de INT0PIN met de 50Hz: de routine verhoogt 'clkToProcess'
  attachInterrupt(digitalPinToInterrupt(INT0PIN), myIntHandler, RISING);

  display.setSegments(str2seg(segBuf1, "boot"));
  delay(1000);                 // 1 seconde wachten (op display de tekst 'boot')

// Is er 50Hz gevonden (is de teller opgehoogt)? Zo niet: maak zelf 50 Hertz
  if(clkToProcess == 0)        // Geen interrupts gezien op INT0?
  {                            // Dan omschakelen naar de interne timer
    detachInterrupt(digitalPinToInterrupt(INT0PIN));
    display.setSegments(str2seg(segBuf1, "no50"));
    delay(1000);
    Timer1.initialize(20000);  // Zet de timer op 20000 microseconds = 50 Hz
    Timer1.attachInterrupt( myIntHandler ); // interrupt routine op deze timer
    no50Hz = true;             // Even onthouden dat we niet echt 50 Hz hebben
  }

De volgende stap wordt (denk ik) het aansluiten van mijn thermo-koppel. Ik kan hier natuurlijk zels een versterkertje voor maken (thermokoppel-signalen zijn te zwak om gelijk op de Arduino aan te sluiten, 41 µV per °C), maar ik denk dat ik maar ga voor de kant-en-klare Adafruit module met de MAX31856. Zit een voorversterker in, maar ook linearisatie, 50-Hertz filtering, koude-las compensatie, A/D converter en alles wat er voor een thermokoppel nodig is. Aansluiting via SPI. Ook in Nederland in diverse webshops verkrijgbaar, voor zo'n €20.

En verder

Links naar algemene info

Nuttige Libraries etc

ESP8266

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