Embedded Linuxrpi.kogekaschoolverlaters.be/online docs/downloads... · 1. Installeer Xming 1....

Post on 25-Aug-2020

6 views 0 download

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