Arduino Nano

ATmega328

De processor op de Nano is wat 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

Deze pagina is (in aanmaak) voor de Arduino Nano, 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!

Waarom een ouderwetse 8-bitter, en niet een simpele ARM M0 32-bit als de LPC8xx of een 32-bit Arduino? Ik wil 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.

De eerste software (februari 2016)

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

Een van de projecten doe ik nog eens 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 (kan ik er altijd later weer een ATtiny in zetten). 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 Pinout

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


Arduino Nano Pinout

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

Volgende projecten

Keramiek-oven

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