Microcontrollers

Algemene Introductie

Wat is een microcontroller

  • Een Integrated Circuit dat een computer systeem bevat.
  • Het is geen CPU maar het bevat er één
  • Tot op een zekere hoogte is een microcontroller "self-sustaining"
    • Er zijn nog enkele randcomponenten nodig zoals een voeding, programmer, ...

Dus we hebben hardware nodig?

  • We maken gebruiken van een ontwikkelingsplatform
    • Arduino
    • Specifiek: Arduino Nano

  • Je krijgt een uitleenkit met alle nodige materialen voor het labo
  • Een puur hardware vak?
    • Nee, een microcontroller heeft een specifieke functionaliteit die de nodige programmatie vereist

Arduino .... Wat is dat?

  • Platform
  • Hardware
  • Software
  • Resources

Arduino: Platform

  • Fast electronics prototyping tool
  • Doelpubliek: Designers / Elektronica leken
  • Voorziet:
    • Hardware
    • Software
    • IDE
    • Documentatie

  • Veel resources beschikbaar

Arduino platform

  • Voordelen
    • Inexpensive
    • Cross-Platform
    • Simple, clear programming environment
    • Open source and extensible software
    • Open source and extensible hardware

Arduino: Hardware

  • Arduino Boards
  • Boards zijn gebaseerd rond een microcontroller
    • Remember: Arduino != Microcontroller

  • Boards voorzien de nodige hardware om met de microcontroller te werken.
  • Boards zijn uitbreidbaar met shields
  • Verschillende boards met specifieke doelen.

Arduino: Boards

Arduino: Uno

  1. Reset switch
  2. USB B Connector:
    • Connectie met PC
    • Voedingsbron (5V)
  3. Barrel jack:
    • Voedingsbron
    • Input spanning 7V - 12V
  4. Voltage regulator

Arduino: Uno

  1. 16MHz kristal
  2. ATMega8U2
    • Hulp microcontroller
    • USB naar UART bridge
  3. ATmega328p
    • Hoofd microcontroller
    • 8 bit mcu
    • AVR familie
    • Brein van het Arduino board

Arduino: Uno

  1. Digitale IO pinnen
  2. Analoge IO pinnen
  3. Voeding / ground / referentie spanningen

Arduino Uno vs Arduino Nano

Wat zijn de verschillen

  • Vormfactor
  • Power opties

Wat zijn de gelijkenissen

  • De microcontroller (ATmega328p)
  • Pinout

Waarom

  • Nano is makkelijk te gebruiken met een breadboard

Waar kunnen een microcontroller voor gebruiken ?

Embedded Systemen

Systemen ....

Een microcontroller is een stukje programeerbare hardware

Op zijn eigen is de functionaliteit gelimiteerd dus zoeken we naar een input en out voor de microcontroller

We hebben dus extra componenten nodig....

We zoeken naar een "toetsenbord, muis en scherm" voor een microcontroller

We zoeken peripherals

Arduino Peripherals

Wat zijn peripherals

  • Hardware elementen
  • Koppelen extra functionaliteit aan Arduino
  • Actuators en Sensors
  • Nood aan randcompontenten
  • Opbouwen van schakeling

Voorbeelden

  • 7 segment 4 digit display
  • Pushbutton
  • Ultrasone Afstandsensor
  • LCD 16x2

Arduino: Shields

  • Addons voor de boards
  • Extra functionaliteit
  • Complexere schakeling van Arduino Peripherals en andere elektronische componenten
    • Motorsturing
    • LCD
    • Communicatie
    • Protoboard
    • ...

  • Standaard vorm factor
  • Ready To Use
  • Veel resources beschikbaar voor een eigen ontwerp

Voorbeelden

  • Joystick Shield
  • Protoshield
  • Shieldstack

Arduino Open Source Hardware

  • Schematics zijn beschikbaar
  • Veel klonen beschikbaar
  • Goedkopere alternatieven
  • Rechtstreeks bestellen uit China

Wat gaan wij met een microcontroller doen?

Wat zit er in de Microcontroller Kit ?

CD4066E Quad SwitchSpeakertjeArduino NanoCNY17-3 - Optocoupler
23LC1024-I/P - SRAMRotary EncoderLCD 16x2ATtiny
330R1k4k710k
LED GEELLED ROODLED GROENPushbutton
7 Segment 4 DigitBreadboard10k trimmerAfstandsensor Ultrasoon
USB kabelBreadboard kabelsServoBT module
100 nf1 uf10 uf2N7000

Wat gaan wij met een microcontroller doen?

Mogelijke opdrachten

  • Kennismaking met Kit, Oefeningen maken op gebruik van individuele componenten, Arduino as DUT
  • Opdrachten met verschillende componenten te gelijk / Interrupts Maken van chronometer met 7 segment
  • Werken met een ATtiny
  • Seriële communicatie met een ATtiny (i2c)
  • Mini Project: Maken van menu LCD met Rotary Encoder

Arduino .... Wat is dat?

  • Platform
  • Hardware
  • Software
  • Resources

Arduino: Software

  • De microcontroller op een Arduino bord word in C/C++ geprogrammeerd
    • Arduino is geen programeertaal

  • Beschikbaar stellen van libraries
    • Libraries zijn geschreven in C/C++
    • Neemt abstractie van de hardware
      • Code kan voor meerdere boards compileren
      • Werking van de microcontroller is verstopt

  • Gebaseerd op:
    • Wiring
    • Processing
    • avr-libc

Programmeren van een Arduino kan op 2 manieren

Blink met de Arduinio libraries


#include <Arduino.h>

void setup()
{
    pinMode(LED_BUILTIN, OUTPUT);
}

void loop()
{
    digitalWrite(LED_BUILTIN, HIGH);
    delay(1000);
    digitalWrite(LED_BUILTIN, LOW);
    delay(1000);
}
        

blink zonder Arduino libraries


#include <avr/io.>
#include <util/delay.h>

int main(void)
{
    DDRB = 1 << 5;
    while (1)
    {
        _delay_ms(500);
        PORTB ^= 1 << 5;
    }
  return 0;
}
        

Dit was het eerste deel van Microcontrollers

Het vak is Microcontrollers niet Arduino

Arduino is een simpele manier om met een microcontroller prototypes te maken

Arduino's originele doelpubliek waren designers

Als studenten Elektronica - ICT willen we weten hoe een microcontroller van binnen werkt

Welke Microcontroller staat er op de Arduino Nano

ATMega328p

ATmega328p

  • Lid van de AVR Microcontroller familie
    • Ontworpen door Atmel
    • 8bit (bus breedte)
    • Aangepaste harvard architectuur
    • Flash memory ipv EEPROM
    • Populair door makkelijk beschikbare tools en Arduino

ATmega328p

  • 8bit mcu
  • 2 timers
  • 6 PWM kanalen
  • 8 kanaals 10bit adc
  • 6 kanaals 8bit adc
  • UART
  • SPI
  • I²C
  • Watchdog
  • Comperator
  • 23 programmeerbare lijnen

ATmega Datasheet

  • Samenvatting
  • Specificaties
  • Functioneel blokdiagram
  • Pinout
  • Absolute maximale waardes
  • Waarheidstabellen
  • Timing diagrammen
  • Mogelijke toepassingen
  • Tutorial: Datasheets lezen
  • FYI: Datasheets ATmega328p - 444 blz.

Tegen het eind van het semester moet jullie dit documenten begrijpen en gebruiken om microcontroller toepassing te maken

Waarom?

Blink met de Arduinio libraries


#include <Arduino.h>

void setup()
{
    pinMode(LED_BUILTIN, OUTPUT);
}

void loop()
{
    digitalWrite(LED_BUILTIN, HIGH);
    delay(1000);
    digitalWrite(LED_BUILTIN, LOW);
    delay(1000);
}
        

Compiled size: 1034 bytes (3.2%)

blink zonder Arduino library


#include <avr/io.>
#include <util/delay.h>

int main(void)
{
    DDRB = 1 << 5;
    while (1)
    {
        _delay_ms(500);
        PORTB ^= 1 << 5;
    }
  return 0;
}
        

Compiled size: 158 bytes (0.5%)

De hardware kunnen we ook verkleinen

Oplossing Mogelijk Vaardigheidsexamen


enum states  {IDLE = 'i', SET = 's', GET = 'g', TOGGLE = 't', COMPARE = 'c'};
uint8_t set_value, last_adc_val;


volatile uint8_t state = IDLE;
uint8_t last_state = GET;


void setup() {
  Serial.begin(9600);
  ADMUX |= (1 << REFS0) | (1 << MUX2) | (1 << MUX0);
  ADCSRA |= (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0) | (1 << ADATE) | (1 << ADEN) | (1 << ADSC);

  DDRD |= (1 << DDD3);
  DDRB |= (1 << DDB1) | (1 << DDB2) | (1 << DDB3);

  EICRA |= ((1 << ISC10) | (1 << ISC11))  ;
  EIMSK |= (1 << INT1);

  TCCR0A = 0;
  TCCR0B = 0;
  TCCR1A = 0;
  TCCR1B = 0;

  TCCR1A |= (1 << WGM10) | (1 << WGM00) | (1 << COM1A1) | (1 << COM1B1);
  TCCR1B |= (1 << CS11) | (1 << CS10);

  TCCR2A |= (1 << WGM20) | (1 << COM0A1);
  TCCR2B |= (1 << CS22);
}

ISR(INT1_vect) {
  state = COMPARE;
}

void set_values() {
  Serial.print("Geef de  waarde in: ");
  set_value = Serial.parseInt();
  Serial.println(set_value);

}

void toggle() {
  EIMSK ^= (1 << INT1);
}

void compare() {
  int diff = set_value - ADC / 4;  
  if (diff < 0) {
    OCR2A = 0;
    OCR1AL = abs(diff);
  }
  if (diff > 0) {
    OCR1AL = 0;
    OCR2A = abs(diff);
  }
}


void loop() {
  if (Serial.available()) state = Serial.read();
  if (state != last_state) {
    switch (state) {
      case (IDLE):
        Serial.println("Entered Idle State");
        break;
      case (SET):
        set_values();
        break;
      case (GET):
        Serial.println("Current ADC value: ");
        Serial.println(ADC / 4);
        break;
      case (TOGGLE):
        toggle();
        break;
      case (COMPARE):
        compare();
        break;
    }
    last_state = state;
  }
  if (last_state != TOGGLE) OCR1BL = ADC / 4;

}
  

Dit was de contextuele schetsing van het vak Microcontrollers

Nu de praktische zaken

Lesgevers

Geert Vanhulle

  • Labos in Module 1
  • Theorie in Module 2
  • geert.vanhulle@ap.be

Maarten Luyts

  • Labos in Module 2
  • Theorie in Module 1
  • maarten.luyts@ap.be

Heb je vraag? Stuur een email naar ons beide

Voorlopige Planning

WeekTheorie Labo  
 WieWatWieWatDeadline studenten
M1W1MALUIntroductieGVHKennismaking Kit, Beginner Tutorials, DUTM1W3
M1W2MALUAlgemene IO operaties + InterruptsGVHBasis combinatie opdracht (gebruik verschillende componten) M1W4
M1W3MALUSerïele communicatieGVHWerken met een ATtiny M1W5
M1W4MALUC/C++ Fundementals + Libraries makenGVHSeriële communicatie met een ATtiny M1W6
M1W5MALUBit Operaties + Intro IO operaties (ADC)GVHMini Project: Maken van menu LCD met Rotary Encoder (individueel)M1EX1
M1W6MALUIO OperatiesGVHBasis IO Operaties met registers #1M1EX1
M1EX1   Vaardigheidstoets + Tonen werking Mini ProjectM1EX1

Voorlopige Planning

WeekTheorie Labo  
 WieWatWieWatDeadline studenten
M2W1GVHInterruptsMALUBasis IO Operaties met registers #2M2W3
M2W2GVHInterruptsMALUInterrupts #1M2W4
M2W3GVHTImersMALUInterrupts #2M2W5
M2W4GVHTImersMALUTImers #1M2W6
M2W5GVHSeriële communicatieMALUTImers #2M2W7
M2W6GVHPower ManagmentMALUSeriële communicatieM2W7
M2W7GVHReservelesMALUMini Test 
M2EX1     
M2EX2     
M2EX3    

Indienen van labos

  • Labos indienen voor de deadline
  • Labos worden niet nagekeken doorheen het jaar
  • Wenst u feedback, maak de opstelling en laad de code op de Arduino en toont dit tijdens de labos
  • Tijdens het vaardigheidsexamen kunnen er mogelijke vragen zijn over jouw oplossing

Evaluatievorm

Kennistoets 30% Digitaal examen
Vaardigheidsexamen 50% Mondeling praktisch examen
Vaardigheidstoets 20% 2 Testmomenten doorheen het jaar.

Regels

  • Optijd komen
    • Bent u te laat, dan moet je inkom betalen
    • Betalen doe je door het opkuisen van het labo
    • Lees: the job of your life
  • Geen eten, alleen drinken in een sluitbare container
  • U komt niet in de kasten in het labolokaal
  • Werk in rust
  • Vaste werkplek in het labo
  • Heb respect voor het materiaal
  • Ruim op na het labo

Getting started met Arduino

  • Hoe maak ik een schakeling?
  • Programmeeromgeving ?
  • Hoe krijgen we onze code op de Arduino ?
  • Basisoefening ?

Hoe maak ik een schakeling ?

Eerst moeten we weten wat de pinnen van een Arduino doen

We kunnen dit opzoeken in de datasheet

Hierin staan de pinnen van de ATMega328P niet die van de Arduino. Er is wel een mapping

We vinden dit terug in een pinout diagramma

Pinout Takeaway

De Arduino pinnen zijn gemapt op de pinnen van de microcontroller

Specifieke functionaliteit van de microcontroller zijn gemapt op specifieke pinnen

D0 en D1 zijn RX en TX Pinnen --> Communicatie met PC

D2 en D3 zijn interrupt pinnen --> Zie later

D3,D5,D6,D9,D10,D11 zijn PWM pinnen --> AnalogWrite

IO Pinnen

  • Literatuur: General Purpose In/Out (GPIO)
  • Doorverbinding van de pinnen van de ATmega328P
  • 2 Onderverdelingen
    • Digitaal (0 - 1)
    • Analoog (0 - 1023)
  • Pinnen kunnen vasthangen aan specifieke functionaliteit
  • Er gelden stroom limieten voor de pinnen

Digitale IO Pinnen

  • Sturen een logisch signaal
    • HIGH (5v)
    • LOW (0v)
  • 2 richtingen

Analoge IO Pinnen

  • Kan spanningen uitlezen
    • Zet deze spanning om naar een discrete waarde
    • Mapping van 0v tot 5v naar een waarde van 0 tot 1023
  • Kan een "spanning schrijven"
    • Een digitale waarde omzetten in fysisch signaal
    • Mapping van de waarde 0 tot 255 naar een signaal van 0v tot 5v
  • Kan dubbel gebruikt worden als een digitale pin

Arduino Programmeer omgeving

  • Arduino IDE installeren
  • Example openen
  • Code uploaden

Arduino: IDE

Arduino: IDE

  1. Verify:
    Compileert de code met avr-gcc
  2. Upload:
    Compileert de code met avr-gcc en
    upload de code met avrdude
  3. New
  4. Open
  5. Save

Arduino: IDE

  1. Serial Monitor
  2. Filename
  3. Sketch
  4. Statusbar
  5. Build output
  6. Board settings

Arduino: IDE

  • Aan te raden instellingen
    • Display line numbers
    • Code folding

Sketches

  • Sketches = Arduino programma's
  • Examples sketches beschikbaar in de Arduino IDE
  • .ino extensie
  • 2 grote componenten
    • void setup();
    • void loop();
  • Documentatie

Blink Sketch


  void setup() {
  pinMode(LED_BUILTIN, OUTPUT);


  void loop() {
    digitalWrite(LED_BUILTIN, HIGH);   // turn the LED on (HIGH is the voltage level)
    delay(1000);                       // wait for a second
    digitalWrite(LED_BUILTIN, LOW);    // turn the LED off by making the voltage LOW
    delay(1000);                       // wait for a second
  }
  

Sketches

void setup() void loop()
Loopt 1 maal Eindeloze loop
Initiële setup Logica

Arduino: Documentatie


Arduino Reference

Code Uploaden

  • Example sketch openen
    File > Examples > 01. Basic > Blink
  • COM Poort selecteren
    Tools > Port > COMX
  • Board selecteren
    Tools > Board > Arduino Nano / Duemilanove / Uno

Getting Started: Programmatie

Programmer

  • Extern toestel data schrijft op het geheugen van de microcontroller
  • Dit is omslachtig
    • Extra hardware
    • Compatibiliteit

  • Wordt nog gebruikt voor productie
  • Voor ontwikkeling: Bootloader
  • Arduino as ISP

Bootloader

  • Hetzelfde concept als de bootloader van een computer
    • Vertelt CPU waar het operating systeem staat
    • Ook mogelijk om het "OS" te overschrijven
  • Werking Arduino Nano
    • Data wordt verstuurt vanuit PC
    • ATmega8u2 zet data om van USB naar UART
    • ATmega8u2 reset ATmega328p
    • ATmega8u2 stuurt data door naar ATmega328p
    • ATmega328p detecteert data op de UART binnen een tijds interval na reset
    • Bootloader op ATmega kopieert data naar het flash geheugen
    • Tijdsinterval afgelopen, ATmega328p boot met bestaande code

Basis IO Operaties

  • pinMode
  • DigitalRead
  • DigitalWrite
  • analogRead
  • analogWrite

PinMode


void setup() {
pinMode(LED_BUILTIN, OUTPUT); 
pinMode(POTPIN, INPUT);
pinMode(BTNPIN, INPUT_PULLUP);


void loop() {
  //doSomething
}
  
  • Een pin kan 3 states aannemen
  • OUTPUT: schrijven naar de pin
  • INPUT: lezen van de pin
  • INPUT_PULLUP: INPUT + voorgeschakelde weerstand
  • Dezelfde functie voor de analoge en digitale pinnen
  • Meer info: klik hier

DigitalWrite


void setup() {
pinMode(LED_BUILTIN, OUTPUT);


void loop() {
  digitalWrite(LED_BUILTIN, HIGH);
  delay(1000);
  digitalWrite(LED_BUILTIN, LOW);
  delay(1000);
}
    
  • Schrijven van constante waarde
    • Hoog (5V)
    • Laag (0V)
  • Gebruik: Aansturen LED, Signaal geven aan IC(Motorsturing)
  • Meer info: klik hier

DigitalRead


void setup() {
  pinMode(pushButton, INPUT);
  pinMode(LED_BUILTIN, OUTPUT);
}

void loop() {
  // read the input pin:
  int buttonState = digitalRead(pushButton);
  digitalWrite(LED_BUILTIN, buttonState);
}
  
  • Uitlezen van een pin
  • Specifieke treshold (TLL niveaus) voor de omzetting naar een constante waarde
    • High (1)
    • Low (0)
  • Gebruik: Uitlezen drukknop
  • Meer info: klik hier

AnalogWrite


void setup() {
  pinMode(ledPin, OUTPUT);
}

void loop() {
  for (int fadeValue = 0 ; fadeValue <= 255; fadeValue += 5) {
    analogWrite(ledPin, fadeValue);
    delay(30);
  }

  for (int fadeValue = 255 ; fadeValue >= 0; fadeValue -= 5) {
    analogWrite(ledPin, fadeValue);
    delay(30);
  }
}
    
  • Schrijven van een voltage naar een pin
    • max 255 - 5V
    • min 0 - 0V
  • PWM
  • Gebruik: Precies aansturen LED, Precies signaal geven aan IC(Motorsturing)
  • Meer info: klik hier

AnalogRead


void setup() {
  Serial.begin(9600);
}

void loop() {
  int sensorValue = analogRead(A0);
  Serial.println(sensorValue);
  delay(1); 
}
  
  • Uitlezen van een variabel voltage signaal
    • max 255 - 5V
    • min 0 - 0V
  • Gebruik: Uitlezen van een potentiometer, Uitlezen van een NTC, Uitlezen van sensorsignaal

Oefeningen

  • Aansturen van LED (met en zonder PWM)
  • Uitlezen van PWM Signaal en Potentiometer
  • Uitlezen van een drukknop

Projecten Smart Systems

Arduino Summer School @ St Polten

IoT Projecten

Zordon
Smart buildings