Embedded Linuxrpi.kogekaschoolverlaters.be/online docs/downloads... · 1. Installeer Xming 1....
Transcript of Embedded Linuxrpi.kogekaschoolverlaters.be/online docs/downloads... · 1. Installeer Xming 1....
Embedded Linux T3EI5Raspberry pi
Inleiding
Embedded Linux EI5Raspberry Pi
Evaluatie:
• P1.1• Test theorie : 50%• Oefening Bash + Python (zonder GPIO) 50%
• P1.2• Concept card 1 - PWM LED Drukknop 50%• Concept card 2 - PWM DC-Motor met H-brug + RGB LED 50%
• P2.1• Concept card 3 – Hardware + DMA PWM (Multithreading) 25%• Concept card 4 – Zelf verzonnen 25%• Concept card 5 – Herhalingsoefening + interrupt 25%• Algemene eindproef 25%
• P2.2• Concept card 6 – Interrupt + LCD 33.33%• Concept card 7 – Zelf serieel protocol opzetten in 2 richtingen 33.33%• Concept card 8 – RS232 communicatie met PC 33.33%
Wat is een Raspberry Pi?
• Mini computer
• Goedkoop
• Linux
• Toepassingen : • Microcontroller sturingen
• Mediaspeler
• Webserver
• …
BELANGRIJK !
• De Raspberry Pi wordt gevoed met een+5.1V micro USB supply (2,5A)• Raspberry pi vraagt 700mA in vollast
• De +5V hangt rechtstreeks aan de USB voeding (max 1A)
• De +3,3V kan max 50mA leveren
• Één GPIO kan je maximum 16mA leveren
• Alle GPIO’s samen (17) kunnen 50mA leveren• (50 / 17 = 3mA per GPIO)
Technical Differences Pi 3 B+ v,s, Pi 3 B
RPI 3 B+ RPI 3 B
Release March 2018 February 2016
Size 85,6 × 56mm 85,6 × 56mm
SOC BCM2837 BCM2837
CPU ARM Cortex-A53(ARMv8-A)
ARM Cortex-A53(ARMv8-A)
CPU cores 4 4
CPU clock 4x 1400 MHz New 4x 1200 MHz
RAM 1024 MB 1024 MB
USB 4x USB2.0 4x USB2.0
Audio HDMI (digital)3,5mm jack
HDMI (digital)3,5mm jack
Network 10/100/1000 MBit New 10/100 MBit
Wlan 2,4/5 GHz WLAN ac New 2,4 GHz WLAN b/g/n
Bluetooth Bluetooth 4.2 New Bluetooth 4.1
GPIO 40 Pins 40 Pins
PoE yes (prepared) New no
power input max. 7 W max. 4,4 W
power source 5V Micro USBmin. 2,5 A
5V Micro USBmin 2,5 A
Price ca. 45$ ca. 38$
Linux
• Commando’s in de shell
• Standaard geen grafische interface
• Open Source
• Distributies• Debian Raspbian
Debian
• Zie Debian family tree• https://upload.wikimedia.org/w
ikipedia/commons/6/69/DebianFamilyTree1210.svg
• Ook ubuntu is hier een onderdeel van
Linux v,s, Windows
• Linux /
• Windows \C:\
Users Windows Windows
system32
Program files Verwisselbare schijf Program files appdata
/ (root)
home sys boot lib etc media var tmp
Commando’s - LXTerminal
Commando Wat het doet
sudo Iets als administrator uitvoeren.
ls Lijst weergeven van bestanden.
cd Wijzigen van directory.
touch Bestand aanmaken.
cat Bestand inlezen.
nano Tekstverwerker
man Infopagina van Commando laten zien.
Meer commando’s :http://www.linuxdevcenter.com/excerpt/LinuxPG_quickref/linux.pdf
Webserver installeren
• sudo apt-get install apache2
• sudo apt-get install php5
• sudo service apache2 restart
/var/www/ -> map waarin de .php files inkomen.
Php webpagina
• Surf naar 10.212.51.X
• cd /var/www/html
• sudo nano index.php
• Inhoud wijzigen -> “ctrl + x” -> “Y”
LED aansluiten
• Vergeet ULN of TD niet !!!!!
Wat heeft u nodig
Benodigdheden
• Rpi
• SD-Kaart
• Toetsenbord
• Muis
• Beeldscherm• HDMI monitor• VGA monitor + VGA HDMI omzetter• Analoge tv
• Ethernet aansluiting
• Voeding
• Luidsprekers
• Breadboard
Installatie van de Pi
Rpi – Raspbian OS installatie
• Download image van operatingsystemRaspbian
• https://www.raspberrypi.org/downloads/raspbian/
• Download al dan niet met GUI (PIXEL)• Kopieer de image op je SD card met “Disk Imager” (zie
server)
• Pi 3 met Jessy : https://www.youtube.com/watch?v=coCOSBFZ3ss
Instellen Static IP
• Start je Pi op via de VGA HDMI adapter• Naam : pi
• Paswoord : raspberry
• Pas je IP adres aan !!!
raspberry pi 2:
• Ga na of je instellingen goed staan : • IP-adress vastzetten
• Sudo nano /etc/network/interfaces10.212.51.1
• DNS instellen
• regel toevoegen in (helemaal leegmaken en dan onderstaande regel toevoegen)
• sudo nano /etc/resolv.conf nameserver 8.8.8.8
raspberry pi 3: eth0
• Ga na of je instellingen goed staan op je eth0 : • ifconfig
raspberry pi 3 – stretch + buster: eth0
• Ga na of je instellingen goed staan op je eth0 : • 2 manieren van connecteren
1. Als je het IP weet kan je er via filezilla in
2. Als je het IP niet weet kan je :
1. Connecteren aan een HDMI scherm + muis + toetsenbord
2. Vie de smartphone app Net Analyzer je netwerk scannen en het ip van je Pi achterhalen
• Configuratiefile aanpassen :• etc/dhcpcd.conf
# Example static IP configuration:interface eth0static ip_address=10.212.51.21/16static routers=10.212.1.1static domain_name_servers=8.8.8.8
raspberry pi 3 – stretch + buster: wlan0
• Ga na of je instellingen goed staan op je WLAN0 : • 2 manieren van connecteren (zie vorige dia)
• Configuratiefile aanpassen :• etc/dhcpcd.conf
• etc/wpa_supplicant/wpa_supplicant.confnetwork={
ssid="TP-LINK_F0225A"psk="1FF0225A"key_mgmt=WPA-PSK
}network={
ssid="telenet-xxxx"psk="paswoordtelenet"key_mgmt=WPA-PSK
}
# fallback to static profile on eth0interface wlan0arping 10.212.1.1arping 192.168.0.1
profile 10.212.1.1static ip_address=10.212.51.x/16static routers=10.212.1.1static domain_name_servers=8.8.8.8
profile 192.168.0.1static ip_address=192.168.0.100/24static routers=192.168.0.1static domain_name_servers=8.8.8.8
Connecteer je pi via het netwerk
1. Installeer Xming1. Installeer eerst het fonts pakket (laat alles default staan)2. Installeer de Xming in dezelfde map en negeer de
waarschuwing1. Selecteer select components “Dont install SSH client”2. Selecteer Select additional task “Make Desktop icon”
2. Open Putty en maak een configuratie aan1. Connection SSH X11
1. Enable X11 Forwarding2. Display location = localhost:03. Remote authentication = MIT-Magic-Cookie-1
2. Session1. Geef je ip van je RPI in2. Slaag deze connectie op voor je ze gaat laden
Connecteer je pi via het netwerk
1. Testen of je via putty en Xming1. Naam : pi2. Paswoord : raspberry
2. Als alles werkt kom je in je Shel van je Pi3. Om je GUI op te starten is er het commando
1. Pi2 Startlxde2. Pi3 Startx
4. Afsluiten doen we met het commando sudo shutdown-h now
5. Verschil Pi 2 v,s, Pi 3 : https://tweakers.net/reviews/4443/2/raspberry-pi-3-net-iets-sneller-dan-de-oude-overeenkomsten-en-verschillen.html
Begrippen
• LXDE = GUI XWindows = Grafische omgeving op RPI• Startlxde of startx• In Raspberry pi3 = PIXEL
• LXTerminal = DOS van linux = Shell• Scrot = figuur maken van LXTerminal
• Scrot mijnfiguur.jpg• Nano = Kleine tekstverwerken om snel configuraties aan te
passen in bestanden• Ctrl-o = Oplagen• Ctrl-x = Stop het programma• Ctrl-G = Help scherm• Ctrl-K = Knip complete regel• Ctrl-U = Plak complete regel
• IdleX = Python editor
Overige applicaties
• Midori = Webbrowser
• Wifi config Zie opdracht 2
• Scratch = eenvoudig spelletjes maken
• Leafpad = Bestanden maken en aanpassen
• File manager = simpele verkenner
• System tools / Task manager
RPi
• Sudo raspi-config• sudo stands for Super User Do; it allows you to run
as another user, usually the super user ( root ), to carry out administrative tasks,
WinSCP / Filezilla
• Met dit programma kan je bestanden van je pc overbrengen naar je Rpi en omgekeerd
• Wij gebruiken hier filezilla voor• Download en test filezilla !
Tools - Filezilla
• Maak een map aan in de cloud en op je pi• Voornaam
• Oefeningen• Afgewerkte oefeningen
• Afgewerkte concept cards
• Kopieer je werkende bash oefeninge via filezilla in deze map
Rechten in de Terminal P51-53
• Er zijn 3 verschillende groepen van gebruikers• User = de eigenaar van dit bestand
• Group = een groep gebruikers
• Other = al de rest
• Via het commando ls –l krijg je de inhoud van een map te zien met al de rechten die zijn ingesteld
Rechten in de Terminal P40-42
Rechten in de Terminal P40-42
Rechten in de Terminal P40-42
• Ls –l
• Chmod 777 hello.c
• Ls -l
Shel Commando’s P44
• Commando’s• Ls = inhoud van een map bekijken• Mkdir x = maak map x aan• Cd x = ga naar map x• Cd x/y = ga naar map y in x• Cd .. = ga één map terug• Rmdir x = verwijder map x maar enkel als hij leeg is• Rm x = verwijder x• Chmod = rechten aanpassen• Man = manual voor een commando (b,v, man ls)
• Installeren van extra software /headers / library’s• Sudo apt-get install uprogramma• Sudo apt-get remove uprogramma
Python
Hello world
Mijn eerste bashprogramma
Bash commando’s
• Te kennen commando’s• Echo• Read• if• For• While• + werken met variabele
• Bash scripting cheatsheet• https://devhints.io/bash
Bash commando’s
• Input
• Read ‘variable’
• Output
• echo …
• OPGELET MET SPATIES !!!!• Text = “Hello world” Fout
• Text=“Hello world” Juist
Bash commando’s
• Maak een bestand aan hello_world.sh• Nano hello_world.sh
• chmod +x hello_world.sh
• echo• # declare STRING variable
• STRING="Hello World"
• #print variable on a screen
• echo $STRING
Bash commando’s
• NUM1=2• NUM2=2• if [ $NUM1 -eq $NUM2 ] ; then• echo "Both Values are equal"• else • echo "Values are NOT equal"• fi • -----------------------------------------• NUM1=2• NUM2=1• if [ $NUM1 -eq $NUM2 ]; then• echo "Both Values are equal"• elif [ $NUM1 -gt $NUM2 ]; then• echo "NUM1 is greater then NUM2"• else• echo "NUM2 is greater then NUM1"• fi
Bash commando’s
• while [ $COUNT -gt 0 ]; do
• echo Value of count is: $COUNT
• let COUNT=COUNT-1
• done
kommagetallen
• sudo apt-get install bc• https://www.shell-tips.com/linux/how-to-use-bc/
OpdrachtOpslagen oefeningen
Oefening 1+2+3 P45 –P49
• Oefening 1 :• Programmeer de regel die op je terminal de tekst “Hello world” komt geven• Maak een bestand “hello.sh” aan in de map pi/voornaam• Echo Hello world• Run het programma “hello,sh”
• Bash hello,sh
• Oefening 2 :• Vraag nu de naam van de gebruiker op in een variabele en toon deze variabele op
je scherm
• Oef 3 : ALL-IN ONE• Programmeer hoger lager met een for loop
• Gebruiker moet zijn naam ingeven
• Gebruiker moet het getal dat in de code is opgeslagen raden in 5 keer
• Je programma komt op het einde zeggen
• Voornaam, je hebt het getal geraden in x pogingen
Sublime Text 3• Download en installatie• Plugin print• Plugin program py over SFTP
Sublime tekst 3
• Download onderstaand programma
• Print je code in dit programma (met een witte achtergrond) en plak deze in je Labo verslag !!!
• https://www.sublimetext.com/3
Download en installatie
• https://www.sublimetext.com/3• Download de gepaste versie
• Installeer
• ,,,
Package-control “printen”
• Tools >> command pallet >> “install package control”
• Tools >> command pallet >> “install package”
• Tools >> command pallet >> “print to HTML”
• Tools >> command pallet >> “Print to HTML:print as HTML via browser:”
Package-control “SFTP”
• Tools >> command pallet >> “install package control”
• Tools >> command pallet >> “install package”
• Tools >> command pallet >> “SFTP”
Package-control “printen”
• Tools >> command pallet >> “install package”
• Tools >> command pallet >> “SFTP”
Tekening : Setup Server
• Save als “Pivoornaam”
Tekening : Browse Server
• Kies bestand
• Kies “edit”
• Werken in sublime en onmiddellijk saven in raspberry pi !!!
Programming Python
Python
• Programmeren in :• Nano
• Idle
• Idlex
Inhoud
• Programming• Python• Algemeen• Tijd
• Programmeertalen in de pi :• C-code b,v, hello.C
• Gcc –o hallo hallo.c compileren van het programma• ./hallo uitvoeren van het programma
• Bash-code b,v, hello.sh• Bash hello.sh
• Python-code b,v, hello.py• Python hello.py
• App voor C++, C#, Python, ,,,• https://www.programminghub.io/
Programming - Python
• Programeertaal
• Ontwikkeld in ’90 - ’91
• Voordelen• Makkelijk
• Low-level
• Multiplatform
• Info: http://www.python.org/
Python 2 v,s, python 3
• Python 2 : print “hello world”
• Python 3 : print (“hello world”)
• Python 2 : thread_start_new_thread
• Python 3 : _thread_start_new_thread()
• Python 2 : verschillend van <>
• Python 3 : verschillend van !
Programming - Algemeen
• Commentaar#Commentaar
• Variabele(n)varGetal = 0varTekst = “Tekst”
• Weergevenprint “Print”print varGetalprint varTekst
• Ingeven
String name = raw_input(“what is your name”)
Integer getal = int(raw_input(“Enter a number”))
Programming - Algemeen
• If/Elseif varGetal = 0:
print “De waarde van varGetal is 0”elif varGetal = 1:
print “De waarde van varGetal is 1”else:
print “De waarde van varGetal is niet 0 of 1”
Programming - Algemeen
• Whilewhile (varGetal < 10):
varGetal = varGetal + 1print varGetal
Programming - Algemeen
• For-loop van 0 tot en met 9• for varIndex in range(0, 10):
print varIndex
• For-loop van 4 tot en met 9 in stappen van 2• for varIndex in range(4, 10, 2):
print varIndex
• For-loop van 0 tot en met 9 print enkel de oneven nummers
for x in xrange(10):if x % 2 == 0:
continue
print x
Hello world
Mijn eerste python programma (ZONDER GPIO’s)
Oefening 1+2+3
• Oef 1 : breng op je uitvoer de tekst “Hello world”
• Oef 3 : Laat de gebruiker iets ingeven in een variabele en doe hiermee een bewerking, Breng de uitvoer op je scherm
• Oef 3 : ALL-IN ONE• Programmeer hoger lager met een for loop
• Gebruiker moet zijn naam ingeven
• Gebruiker moet het getal dat in de code is opgeslagen raden in 5 keer
• Je programma komt op het einde zeggen
• Voornaam, je hebt het getal geraden in x pogingen
Evaluatie P1 :
Fritzing
Tools - Fritzing
• Tekenprogramma voor breadboard opstellingen• Breadboard / Schema / PCB / code
• Info: www.fritzing.org
Fritzing
Mijn eerste python programma (MET GPIO’s)
GPIO pins
BELANGRIJK !
• De Raspberry Pi wordt gevoed met een+5.1V micro USB supply (2,5A)• Raspberry pi 3 vraagt 700mA in vollast
• De +5V hangt rechtstreeks aan de USB voeding (max 1A)
• De +3,3V kan max 50mA leveren
• Één GPIO kan je maximum 16mA leveren
• Alle GPIO’s samen (17) kunnen 50mA leveren• (50 / 17 = 3mA per GPIO)
Tools – breadboard
Tools – breakout module
GPIO header RPI2 model B
Bash flash- LED zie p 100
Gpio –g mode 4 outWhile trueDo
gpio –g write 4 1sleep 1gpio –g write 4 0Sleep 1
done
Bash flashled.sh
Programming – Python (versie 2)
• Python program.py• sudo apt-get update
• sudo apt-get install python-dev python-pip
• sudo pip install wiringpi
• sudo apt-get install python-dev python-rpi.gpio
Programming – Python (versie 3)
• Python3 program.py• sudo pip3 install wiringpi
Python flash- LED
import wiringpifrom time import sleep
wiringpi.wiringPiSetupGpio() wiringpi.pinMode(24,1)
while True:wiringpi.digitalWrite(24, 1) sleep(0.5)wiringpi.digitalWrite(24, 0) sleep(0.5)
python flashled.py
OPGELET HOOFDLETTER GEVOELIG !!!
Wiringpi V,s, RPI.GPIO libraryRPI.GPIO (LCD + Interrupt)
import wiringpi import RPi.GPIO as GPIO
wiringpi.wiringPiSetupGpio() #use GPIO nummering
GPIO.setmode(GPIO.BCM) #use GPIO nummering
wiringpi.pinMode(25,0) #GPIO 25 = input GPIO.setup(18, GPIO.OUT) #GPIO 24 = output
wiringpi.pinMode(24,1) #GPIO 24 = output GPIO.setup(18, GPIO.IN) #GPIO 24 = input
wiringpi.pinMode(23,2) #GPIO 23 = PWM GPIO.wait_for_edge(23, GPIO.RISING)
my_input = wiringpi.digitalRead(25) #pin inlezen
GPIO.wait_for_edge(23, GPIO.FALLING)
wiringpi.digitalWrite(24, 1) #pin op 3,3V zetten GPIO.output(12, GPIO.HIGH) # or GPIO.output(12, 1) # or GPIO.output(12, True) #pin op 3,3V zetten
wiringpi.digitalWrite(24, 0) #pin op 0V zetten if(GPIO.input(23) ==1) #pin op 0V zetten
wiringpi.pinMode(24, 0)#pin op het einde als input zetten, hoog impedant
Wiringpi
wiringpy2 i,p,v, wiringpyNiet de juiste manier van een drukknop inlezen – wordt nog duidelijk,,,
Drukknop inlezen (deftig)
Tools – ULN2803 / TD62783APG
• ULN2803 TD62783APG
Pin 9 = GNDPin 10 = NC
Pin 9 = VCC = 5V of 3,3V of ,,,Pin 10 = GND
Drukknop inlezen
A
B C
Drukknop inlezen met 3,3 V en geen 5V !!!
Verklaring foutief schema
• A Als de drukknop open is hangt de input pin los (zwevend) en zal deze niet volledig nul zijn, Door statische elektriciteit kan het zijn dat de pin als een één wordt gezien i,p,v, een nul
• B Nu trekken we bij het openen van de drukknop de pin naar de GND. De pin is nu zeker nul bij een open drukknop.
• C De weerstand van 390 Ohm dient als stroom beperking bij volgende fout :• Als je de input pin per toeval als output definieerd• Als je nu een nul stuurt (pin hangt nu intern aan de GND)• Als we nu drukken op de drukknop zal er geen
rechtstreekse kortsluiting zijn van 3,3 naar de GND (pin) maar zal de stroom beperkt worden door de 390 Ohm
Programming - Tijd
• Initialiserenimport time
• Tijdtime.sleep(<tijd (s)>)
Python (try except)
• try:
• # hier staat u programma
• except KeyboardInterrupt:
• #hier komen we in bij het sluiten van u programma met Ctrl-C
• raise
• except:
• # hier komen we bij alle andere fouten
MOSFET - IRL540N
• D1 = Vrijloop diode voor inductieve last
• R1 = trekt gate omlaag als de 3,3V van de pi weg is = 10KOhm
• RL1 = belasting (motor / LED / ,,,)
Tools – RGB LED
• Type NR : L-154A4SURKQBDZGW
• Info: www.farnell.com/datasheets/1683535.pdf
Concept 1 : PWM simulatie op de LED met een drukknop• Hardware aansluiting• Voorbeeld code• Deelopdrachten
C1 : Hardware aansluiting
1) Teken het schema om een drukknop in te lezen
2) Teken het schema om een LED aan te sturen via een ULN2803
C1: Voorbeeldcode
Inlezen van een drukknop
if io.digitalRead(6):TellerR=TellerR +1print TellerRwhile io.digitalRead(6):
passtime.sleep(0.05)
Knipperfrequentie aanpassen met drukknop
Verband / formule zoeken tussen u delay en u knipperfrequentie
Pin = 1Sleep(delay)Pin = 0Sleep(delay)
DC aanpassen met drukknopstel f = 100Hz T = 10msDC 10% = 1ms hoog en 9ms laagTellerDC van 0 tot 10Pin = 1Sleep((teller)/(f*10))Pin = 0Sleep((10-teller)/(f*10))
C1 : Deelopdrachten
1. Laat de led oplichten
2. Lees de drukknop in en programmeer een teleruptorschakeling
3. Laat de LED knipperen tegen een bepaalde frequentie
4. Laat de frequentie variëren afhankelijk van het aantal pulsen op de drukknop
5. Laat de duty cycle variëren afhankelijk van het aantal pulsen bij f = 100Hz
6. Combineer voorgaande oefeningen om aan de totaalopdracht te voldoen
Concept 1 : PWM simulatie op de LED met een drukknop
Concept 1 : PWM simulatie op de LED met een drukknop
BESCHRIJVING OPDRACHT :
• Als we ons programma runnen zal de LED knipperen tegen 1Hz en een dutycycle van 50%. Er zijn twee drukknoppen aangesloten op de Pi. D1 zal de frequentie aanpassen en D2 zal de dutycycleaanpassen.
• Drukken we één maal op D1dan zal de LED knipperen tegen een frequentie van 2Hz, drukken we nogmaals wordt dit 4Hz. Na 10 maal drukken wordt dit dus 20Hz. De 11de
keer zal de LED opnieuw knipperen tegen 1Hz.
• Drukken we op D2 dan zal de DC met 10% verhogen. Éénmaal drukken is dus 60%, 5 maal drukken is dus 100%. Na 6 maal drukken zal de DC verder gaan op 10%, 7 maal is dus 20%. Na 10 maal drukken zijn we dus terug bij 50%.
\r in je print
• Default wordt er achter een print een newline karakter geplaatst (\n)
• Als je dit niet wenst
• \r zorgt ervoor dat je cursor naar het begin van je regel springt na je print• Zie volgende dia
# use the named argument "end" to explicitly specify the end of line stringprint("Hello World!", end = '')print("My name is Karim")# output:# Hello World!My name is Karim
# use the named argument "end" to explicitly specify the end of line stringprint("Hello World!")print("My name is Karim")# output:# Hello World!#My name is Karim
Extra : Concept 1
• Laat nu je frequentie en DC telkens overschreven worden op je scherm
• Voorbeeldcode van overschrijven :
from time import sleep #importeer time.sleep als sleepimport sys #importeer sys
try:msg=1CURSOR_UP_ONE = '\033[K'ERASE_LINE = '\x1b[2K'
while True:sys.stdout.write(CURSOR_UP_ONE)sys.stdout.write(ERASE_LINE+'\r')print(msg, end='\r')msg=msg+1sleep(0.5)
except KeyboardInterrupt: #Als "ctrl+c" wordt gedruktsys.exit(0)
Tools – DC motor
• Type Nr : opitec RF300
• Gegevens : • Opstartstroom slechts 12 mA
• 0,45 - 5 V DC
• ø 24 mm, 12 mm lang, as ø2 mm,
• Waarden (onbelast): 2 V - 2350 omw./min - 0,022 APer stuk
Tools – H-brug L293D
Tools – H-brug L293D
Tools – H-brug L293D
Tools – H-brug L293D
Hello world
Python met functies
Programming - Algemeen
• Method / functiedef methodPrint():
print “Methode”
methodPrint()
Python (functie) P80 tot 83
Concept 2 : PWM simulatie op de RGB LED en de DC motor in twee richtingen met twee drukknoppen• Hardware aansluiting• Voorbeeld code• Deelopdrachten
C2 : Hardware aansluiting
1) Teken het schema om twee drukknoppen in te lezen
2) Teken het schema om een LED aan te sturen via een TD62783
3) Teken het schema om de motor aan te sturen met een H-brug
C2: Voorbeeldcode
Tip 1:
if direction == 1 and speed > 0:speed = speed - 0.025if speed == 0:
direction = not(direction)richting = not(richting)
Tip 2 :io.digitalWrite(23,color == 0) io.digitalWrite(24,color == 1)io.digitalWrite(25,color == 2)
C2 : Deelopdrachten
1. Laat om de seconde de led oplichten in een verschillende kleur (Rood Groen Blauw)
2. Laat de motor links en rechts draaien via de H-brug
3. Zorg dat het inlezen van D1 en D2 de snelheid van je motor kan aanpassen
4. Combineer voorgaande oefeningen om aan de totaalopdracht te voldoen
Concept 2 : PWM simulatie op de RGB LED en de DC motor in twee richtingen met twee drukknoppen
Concept 2 : PWM simulatie op de RGB LED en de DC motor in twee richtingen met twee drukknoppen
• BESCHRIJVING OPDRACHT :
• Als we ons programma runnen zal de motor niet draaien en zal de RGB LED blauw oplichten. We gaan twee drukknoppen inlezen.
• D1 zal de motor in 10 stappen van 0 naar 100% (RECHTS) laten draaien, als de motor tegen 100% rechts draait zal deze drukknop geen effect meer hebben.
• D2 zal de motor in 10 stappen van 0 naar 100% (Links) laten draaien, als de motor tegen 100% links draait zal deze drukknop geen effect meer hebben.
• Als de motor 60% links draait en we drukken op D1 zal de motor 10% trager draaien in de linkse richting, dus nog op 50% links. Dit geld ook voor D2, als de motor rechts aan het draaien is zal een druk op D1 de motor laten vertragen met 10%.
• De RGB LED zal als volgt reageren :• Draait de motor niet zal de blauwe LED oplichten• De rode LED geeft de snelheid weer in de rechtse draaizin (met PWM)• De groene LED geeft de snelheid weer in de linkse draaizin (met PWM)
Trim 2 :
Voorbeeldcode functie :
• Method / functiedef methodPrint():
print “Methode”
methodPrint()
Multithreading!!!
Multithreading
• Geen drukknoppen inlezen in multithread. Dit doen we later met interrupt !
Voorbeeldcode Multithreading:
Multithreading stretch t,o,v, jessie
• Python 2• import thread
• thread.start_new_thread(main,())
• Python 3• import _thread
• _thread.start_new_thread(main,())
Variabele (global variable)
• https://www.tutorialspoint.com/python/python_multithreading.htm
PWM gebruik + verschillende manieren
Programming - PWM
• 3 domeinen• Vermogen sturing
• Snelheid DC motor• Helderheid LED• ,,,
• Servo sturing• De hoek bepalen van een servo motor
• RF zender / ontvanger• Standaard RF zenders met bijhorende
ontvangers sturen een PWM signaal uit afhankelijk van de input.
Programming - PWM
Programming - PWM
• 3 manieren• Software PWM met zelf ingebouwde sleep functie
• Op elke GPIO pin• Zeer traag/belastend voor je programma• Programma doet niets terwijl je sleep functie doorlopen
wordt• 100µs timing resolutie
• DMA PWM met extra library RPIO.PWM• Op elke GPIO pin• Halfweg tussen software en hardware PWM• 1µs timing resolutie
• Hardware PWM• Zeer naukeurig• Enkel mogelijk op GPIO pinnen 18 en 13
Servo motor
Servo sturing
Servo sturing (schoolservo’s)
• GOED BEGRIJPEN BIJ DMA PWM !!!
• Maak tekening op bord vanuit datasheet :• Periode 20ms = 50Hz
• 0° = 0,75ms = 3,75% van 100% DMA
• 180° = 2,25ms = 11,25% van 100% DMA
• 1,5ms is dus je bereik van je sturing
• 11,25% - 3,75% = 7,5% waarmee je van 0 tot 180°kan sturen
Pi
Invoer INgr = 0°-180° DCpr = 3,75% - 11,25% PWM naar Servo
MINpr = (0,75ms/20ms)*100MAXpr = (2,25ms/20ms)*100BEREIKpr = MAXpr – MINpr
Dcextrapr = (INgr / 180°)*BEREIKpr
Dcoffsetpr = (0,75ms/20ms)*100%
DCpr = DCoffsetpr + DCextraprpwm.ChangeDutyCycle(DCpr)
Programming – PWM (software)
import wiringpi, os
from time import sleep
io = wiringpi.GPIO(wiringpi.GPIO.WPI_MODE_SYS)
io.pinMode(27, io.OUTPUT)
dutycycle = 0
while True:
io.digitalWrite(27,1)
time.sleep((100-dutycycle)/1000.00)
io.digitalWrite(27,0)
time.sleep(dutycycle/1000.00)
Programming – PWM (DMA)
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM)
GPIO.setup(18, GPIO.OUT)
pwm = GPIO.PWM(18, 50) pin 18 gebruiken op 50Hz
pwm.start(25) start met een DC van 25%
dutycycle = 0
try:
while True:
dutycycle =(float(raw_input("geef duty cycle:")))
pwm.ChangeDutyCycle(dutycycle)
except KeyboardInterrupt:
pwm.stop()
GPIO.cleanup()
Programming – PWM (Hardware)
import wiringpi2 as wiringpi
from time import sleep
wiringpi.wiringPiSetupGpio() # If using BCM GPIO numberswiringpi.pinMode(18,2) # pwm only works on GPIO port 18 en 13
wiringpi.pwmSetMode(0) # pwm setmode 0 = PWM_MODE_MS = traditionele pwm met een vaste frequentie
wiringpi.pwmSetClock(192) #19.2MHz / 192 = 100KHz
wiringpi.pwmSetRange(2000) #100KHz / 2000 = 50Hz = een periode van 20ms
dutycycle = 0
while True:
dutycycle =(float(raw_input("geef duty cycle:")))
tijd=((float(dutycycle)/100)*2000)
wiringpi.pwmWrite(18,int(tijd))
Concept 3 : Hardware PWM + DMA PWM• Hardware aansluiting• Voorbeeld code• Deelopdrachten
Concept 4 : Herhalingsoefening na test• Hardware aansluiting• Voorbeeld code• Deelopdrachten
Programming - Algemeen
• Method / functiedef methodPrint():
print “Methode”
methodPrint()
Python (functie) P80 tot 83
Function local and global variable
• In onderstaande oefening hebben we 2 x total als local variable.
• Total in de functie (enkel gekend in de functie)
• Total in de main (enkel gekend in de main)
Programming - GPIO
• General-Purpose Input/Output• Ingangen
• Uitgangen
• Librarysudo apt-get install python-rpi.gpio
Programming - GPIO
• Initialiserenimport RPi.GPIO as GPIO
GPIO.setmode(GPIO.BOARD)#BOARD: Nummers, BCM: GPIO Namen
GPIO.setup(<pin>, GPIO.OUT)#IN: Ingang, OUT: Uitgang
Programming - GPIO
• UitgangenGPIO.output(<pin>,GPIO.HIGH)#HIGH: 3,3V, LOW: 0V
Programming - GPIO
• IngangenGPIO.input(<pin>)
if (GPIO.input(<pin>) == GPIO.HIGH):
print “Ingang"
Programming - GPIO
• AfsluitenGPIO.cleanup()
Programming - Interrupt
• ActiverenGPIO.add_event_detect(<pin>, GPIO.FALLING, callback=interrupt,bouncetime=300)#FALLING: Dalende flank, RISING: Stijgende flank• bouncetime=300 is soms niet voldoende,,,
dender van drukknoppen wordt nog gedetecteerd• Oplossing : bouncetime=600def interrupt(varPin):
print varPin
• DeactiverenGPIO.remove_event_detect(<pin>)
Voorbeeldprogramma
from time import sleep
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM)
GPIO.setup(21, GPIO.IN)
def interrupt(ok):
print "Owkeyy"
GPIO.add_event_detect(21, GPIO.RISING, callback=interrupt, bouncetime=300)
try:
while True:
sleep(3)
print "test"
except KeyboardInterrupt:
GPIO.cleanup()
GPIO.remove_event_detect(21)
Programming – LCD
Programming – LCD
LCD Pin Function Pi Function Pi Pin01 GND GND P1-0602 +5V +5V P1-02
03 Contrast GND P1-0604 RS GPIO7 P1-2605 RW GND P1-06
06 E GPIO8 P1-2407 Data 0
08 Data 109 Data 210 Data 3
11 Data 4 GPIO25 P1-2212 Data 5 GPIO24 P1-1813 Data 6 GPIO23 P1-16
14 Data 7 GPIO18 P1-1215 +5V via 560ohm
16 GND P1-06
Programming – LCD
• RW = read or write mode Ground
• Pin 3 = Contrastregeling Tussen 0V en 5 Vvia weerstand 4K7ohm Ground
• Pin 15 = Backlight 5V via weerstand 390ohm
Programming – LCD
• 2 manieren Library importeren ofwel installeren• 1) Library installeren RPLCD (importeren)
• 2) Eigen code LCDlib.py aanpassen• Code downloaden, kopieren in je project en “while true”
aanpassen
Programming – LCD
• Oplossing 1 : Library installeren RPLCD importerensudo apt-get install python-pipsudo pip install RPLCD
Programming – LCD
• Oplossing 1 :
• Werkende Codes :
import RPi.GPIO as GPIO
from RPLCD.gpio import CharLCDlcd=CharLCD(cols=16, rows=2, pin_rs=7, pin_e=8,pins_data=[25,24,23,18],numbering_mode=GPIO.BCM)
lcd.clear()
lcd.write_string(u'%s' %(Str))
lcd.close()
Programming – LCD
• Oplossing 1 :
• Schrijvenlcd.write_string(u'Hello World')
• Positie veranderenlcd.cursor_pos = (<rij>, <kolom>)
Programming – LCD
• Oplossing 2: LCD code kopiëren en in de While true je eigen code schrijven
• Import py LCD library https://bitbucket.org/MattHawkinsUK/rpispy-misc/raw/master/python/lcd_16x2.py
• Meer info : http://www.raspberrypi-spy.co.uk/2012/07/16x2-lcd-module-control-using-python/
Programming – LCD
• Afsluitenlcd.close(clear=False)#True: LCD wissen, False: LCD niet wissen
Concept 5 : Interrupt + LCD• Hardware aansluiting• Voorbeeld code• Deelopdrachten
Serial
Serial – zelf serieel protocol ontwikkelen
• Concept card 7 : Zelf serieel protocol opzetten in 2 richtingen
Bluetooth HC-05
Serial (UART) poortHC-05
• Import serial !!!• RxD
• TxD
• GND
• RS-232 protocol
• PC – UART +-12V verbinden via MAX232 naarTTL niveau
Bluetooth HC-05
• Schema :
• https://electrosome.com/hc-05-serial-bluetooth-module/
• Connecteer de HC05 als volgt.• VCC power supply. Typically hooked up to 3,3V.• GND ground. Typically hooked up to GND • RX reception pin. Typically hooked up to transmission pin (TX) • TX transmission pin. Typically hooked up to reception pin (RX) • State is HIGH when the module is connected = output• Key out EN must be set to HIGH (3.3V) to enter configuration (AT) mode and must be
disconnected to enter communication mode.• Zet deze pin op 3,3 voor je de VCC in 3.3 steekt. Plug daarna de VCC in 3.3V en trek de
enable pint terug uit. Nu knippert de led traag. Nu zit je in AT mode en kan je via AT commando’s dingen veranderen.
HC-05 : AT-mode•ls -l /dev/serial* kijken welke serial ports er mogelijk zijn•sudo raspi-config Interfaces Serial poort opzetten•raspi-gpio funcs•sudo nano /boot/config.txt
1)scroll naar onder2)#.......... 3)enable_uart=14)dtoverlay=uart1 voeg onderaan toe
•sudo nano /boot/cmdline.txt1)Voeg toe :
•sudo reboot•dtoverlay -h uart1 Geeft de pinnen weer voor de uart•raspi-gpio get 14-15•pinout•ls -l /dev/serial* kijken welke serial ports er mogelijk zijn•sudo apt-get install picocom•sudo reboot•sudo picocom /dev/serial0 -b 38400 -i --omap crcrlf –c
1)AT+UART=9600,0,02)AT+NAME=HC05-VOORNAAM
•Ctrl + A + X Uit picocom gaan
HC-05 : Master / Slave
• Overage commando’s
• https://linux.die.net/man/8/picocom
• Slave Configuration• To set the module as a slave, you can change the name as AT+NAME=HC05-Slave and choose the
communication parameters and the PIN code that you want. You’ll need to make sure that master and slave as the same communication parameters.
• AT returns OK
• AT+NAME=HC05-Slave
• AT+UART=9600,0,0
• AT+ROLE=0
• Enter AT+ADDR to obtain the module address (ex: +ADDR:98d3:32:21450e)
• Master Configuration• To set the module as master, you need to change the role and set the same communication parameter as the
slave module.
• AT returns OK
• AT+NAME=HC05-Master
• AT+UART=9600,0,0
• AT+ROLE=1
• The slave module address must be enter in the master module to allows it to appair: AT+BIND=98d3,32,21450e (replace dots “:” by coma “,”)
HC-05
• Concept card 8 : RS232 UART Bluetooth
Herhalingsoefening Paasexamen
• Concept card 9 : Bluetooth Herhalingsoefening'Creativiteit‘
Trimester 3 : Project
• Project buggy :• Via je smartphone app je buggy een parcours laten
afleggen (gyroscoop)• Servo op het dak dat richting aangeeft om niet tegen
randen van parcours te rijden• 4 x HC-SR04 gebruiken• Zoemer / piep signaal• Omxplayer• LCD• Multithreading• interrupt• Servo’s• DC-motoren
Bedankt!
Smets Thomas