Raspberry Pi Recepten - Deel 7

Vergelijkbare documenten
Raspberry Pi recepten

Raspberry Pi prototyping-board

Programmeren van de Raspberry Pi.

DOBBELSTEEN 2.0. Stap-voor-stap instructie

Accelerometer project 2010 Microcontroller printje op basis van de NXP-LPC2368

Project Embedded Linux Domaza. Elektronica-ICT. Dimitri Kozakiewiez Jonas Govaerts. Academiejaar

WORKSHOP ORANGE PI & PYTHON v september 2017

EmSE presentatie. Raspberry Pi: Mijn eerste hapjes

Raspberry Pi Interfacing.

Microcontrollers. Robert Langenhuysen, PA0RYL

Om een ander voorbeeld aan te halen waar er wel een opsplitsing van toepassing is:

Monopoly: Howest edition

TomTom ecoplus. Update Tool

De AT90CAN microprocessor van ATMEL in de motorvoertuigentechniek (4)

Configureren en installeren OPENOB op Raspberry PI

Installeren van de Arduino programmeer omgeving

INHOUD. Dankwoord...xvi Inleiding... xvii De basis... 2

Weerstation. Wireless connectie PC en Arduino C.G.N. van Veen. HiSPARC. 1 Weerstation. 2 APC module installeren. 2.1 Zenden en ontvangen

Trimble T&L Activation CC3 after installation V1-5 NL

De Arduino-microcontroller in de motorvoertuigentechniek (6)

Niveaudetectie van gevulde wijnflessen

Handleiding voor installatie en gebruik van

Nespresso Raspberry Pi

Handleiding software USB PIC DEV. BOARD

Raspberry Pi de eerste stappen.

Open het bestand met winrar en klik op uitpakken in vervolgens op bureaublad en als laatste op ok

Spanningdriver LEDVD5CH20A-V8 0-10V interface met display

Bluetooth Software Update Handleiding voor Windows 7. Geschikt voor 2012 producten CDE-13xBT & CDE-W235BT & CDA-137BTi

Connect a Thing! WORKSHOP solderen electronica raspberrypi websocket. onderzoek creativiteit IoT web sensoren. [ competenties 21 st Century Skills ]

DE ASTRO PI KLAARMAKEN VOOR GEBRUIK

Besturing van de Miniatuurwereld RM-U. Gebruik van de Bootloader

Controleer voor aanvang van de installatie of alle benodigde onderdelen aanwezig zijn. In de doos dienen de volgende onderdelen aanwezig te zijn:

Raspberry Pi HCC- Haaglanden Tim Woldring

TrimbleT&L DOC. Activatie CarCube Na installatie

Nederlandse versie. Inleiding. Inhoud van de verpakking. Specificaties. Aanvullende specificaties. BT200 - Sweex Bluetooth 2.0 Class II Adapter USB

Spanningdriver LEDVD5CH20A-V12 ZigBee interface met LCD display

12.1 Stapsgewijs uw Bluetooth monitoring systeem installeren.

LocoServo Handleiding

Elektor Uno R4 Installatie & Test

Selecteer het NRF52-Dk platform in de IDE rechtsboven in het browser scherm.

AVR-DOPER MINI ASSEMBLAGE HANDLEIDING + LAYOUT. Geschreven door: Tom Vocke

Installatie-instructies

Arduino CURSUS. door Willy - 09-juni-2017

DATA SHEET C2-20. Besturing voor elektrische actuators. DATA SHEET C2-20 A&E Trading b.v. 1

Seven segments of Pi

LocoServo Handleiding

DE ASTRO PI PROGRAMMEREN VOOR MISSION ZERO

Wat heb je nodig: Software: Installeren RaspberryPi

TrimbleT&L DOC. Carcube V3 activatie na installatie FW versie 1.52

Intramed procedure. Intramed en Windows Upgraden naar Windows 7

SI-Profibus. Unidrive M700-M702 en Siemens S7-300 PLC (STEP 7)

Het µclab voor Arduino UNO, NANO en Arduino UNO pincompatible

Spanningdriver LEDVD5CH20A-V11 WiFi interface met LCD display

Handleiding 4 kwadrant regeling

Spanningdriver LEDVD5CH20A-V9 DALI interface met LCD display

Spanningsdriver 1 Compensatie van spanningsval

Project : Draagbare monitor en internet-gateway voor (draadloze) biosensoren Inleiding Gebruikte componenten

EDK Walkthrough: Hardwareontwerp met GPIO en UART Deel 1

De Arduino-microcontroller in de motorvoertuigentechniek (4)

Handleiding VBus. 1. Ga naar

Adventskalender Raspberry Pi 2017

Snel aan de slag met de Mini Squirrel datalogger

Raspberry Pi Plex server installeren

MD35 Aansluitschema Onderdeel nr:

SI-Profinet. Unidrive M200-M400 en Siemens S PLC (TIA portal)

Velbus DIN-rail RS232 & USB interface

Bouwbeschrijving UniSAI

Spanningdriver LEDVD5CH20A-V5 0-10V en DALI

Installatiehandleiding Belfius Cardreader Connector

Ringspiraal Stalen zenuwen en Arduino als scheidsrechter

1. Hardware Installatie Installatie van Quasyscan...6 A. Hoe controleren of je een actieve internetverbinding hebt?...6 B.

Fiery Driver Configurator

HANDLEIDING. Aan de slag met je Retropie. SOS Solutions

Installatie handleiding

Deze handleiding geeft uitleg over de installatie van hard- en software van HTvision V.O.F.

Microcontrollers Labo

Spanningdriver LEDVD5CH20A-V7 Real Time Clock met LCD scherm

Keuzedeel Programmeren van microcontrollers (K0730, 240 uur)

Ladibug Document Camera Image Software Gebruikershandleiding

Gebruiksaanwijzing GPIO interface voor BrightSign - HD players

Meet the Arduino FAMILY

MODBUS remote I/O-unit type MODBUS4S110

Netwerkprinter Dell 1320C installeren op Ubuntu LTS - Lucid Lynx

Installatie van Linux Mint 13

Voeler ingang van de ilog recorder. Stop de temperatuurvoeler

Spanningsdriver LEDVD5CH10A-V12 ZigBee interface met LCD display

Raspberry Pi The ultimate hobby computer. Bert Mengerink HCC Haaglanden Zoetermeer

Spanningdriver LEDVD5CH20A-V10 RJ45 Ethernet connector

Installatie handleiding voor de I-FREE03TV tv on the move

1. Sluit de LED aan zoals afgebeeld 2. Sluit de USB-kabel aan op de Arduino 3. Klik op de knop uploaden 4. De LED begint te knipperen

Voor alle versies: firmware 4.0e, firmware 4.1e, firmware 4.2e, Firmware 4.3e

Wat is Arduino? Arduino = microprocessor (Atmel)

Workshop Arduino voor beginners deel 2

1. WAT STAAT ER OP DE BORD HET LEERBORD TESTEN DE PC-VERBINDING TESTEN... 6

A Quick Start Guide: AVR programmeren

SINT JORISINSTITUUT RASPBERRY PI. Karl

EmSE presentatie. Starten met de ATtiny2313: Een RGB powerled driver Kees Moerman, 13 juli 2010

Useless Machine. Saxion Hogeschool Enschede ACT Kunst en Techniek Project Creative Solutions

Transcriptie:

Raspberry Pi Recepten - Deel 7 PWM op het menu Tot nu toe hebben we in deze serie gekeken naar allerlei digitale signalen: GPIO, Seriële UART, SPI en I 2 C. We hebben ook analoge signalen (via SPI) gezien. Wat is er nog meer? Dit keer gaan we PWM-functionaliteit toevoegen aan onze Raspberry Pi. Tony Dixon (Verenigd Koninkrijk) PWM-interfaces in hardware Een PWM-signaal bestaat uit een blokgolf waarvan de pulsbreedte kan worden aangepast of, in technische termen, gemoduleerd. Door die verandering varieert ook de gemiddelde waarde van de golfvorm. PWM wordt vooral gebruikt om elektrische apparaten zoals lampen en motoren te regelen. Het systeem-op-een-chip (SoC) dat het hart van de Pi vormt, de BCM2835 van Broadcom, heeft twee PWM-kanalen in de hardware. De ene wordt door het systeem gebruikt voor het genereren van audio en de andere, PWM0, is vrij ter beschikking. Die is te vinden op pen 12 (GPIO18) van de uitbreidingsconnector van de Raspberry Pi (zie tabel 1). Dimmen van een LED We kunnen PWM0 gebruiken om een LED te dimmen. Om het dimmen van een LED via PWM te demonstreren sluiten we een LED in serie met een weerstand van 330 Ω aan tussen PWM0 (GPIO18/pin 12) en massa. Normaal gesproken zouden we nu Python opstarten en met de RPi.GPIO-library interessante dingen doen met de PWM-uitgang, maar vreemd genoeg biedt RPi.GPIO geen elektor post Project No. 20 1

ondersteuning voor PWM0. Daarom gaan we wiringpi installeren, een library die is geschreven door Gordon Henderson [1]. wiringpi is een C-library voor de Raspberry Pi en is te gebruiken vanuit veel verschillende programmeertalen, ook vanuit Python. wiringpi lijkt sterk op wiring, het software-platform voor Arduino. Om te beginnen moeten we nog wat software installeren. Installeer eerst de Python Package Installer (PiP) met: sudo apt-get install python-dev python-pip Download en installeer daarna wiringpi voor Python met: sudo pip install wiringpi2 Start dan IDLE, de Python IDE, en voer de code uit listing 1 in. Dit Python-programma stelt GPIO18/PWM0 in als een digitale output. Daarna komt het programma in een lus waarin de modulatie van PWM0 stap voor stap wordt vergroot. Naarmate het PWM-signaal toeneemt, gaat de LED feller branden. PWM-interfaces in software Goed, we hebben dus een hardware-pwm op de uitbreidingsconnector, maar als we nu eens meer dan één PWM-signaal willen hebben? Dan kunnen we een PWMchip zoals de 16-kanaals 12-bits PCA9685 van Texas Instruments gebruiken om extra PWM-kanalen te maken. Of we kunnen met software een PWM-signaal maken, zonder geld uit te geven. Een kleine waarschuwing: Normaal gesproken is het geen probleem om een software- PWM te gebruiken op een embedded platform zoals een Arduino, waar de processor alleen de toepassingscode draait. Maar als we een software-pwm gebruiken op een universele computer zoals de Raspberry Pi, moeten we er rekening mee houden dat daarop een volledig besturingssysteem (OS) draait, dat allerlei verschillende taken en programma s tegelijk uitvoert. Daardoor kan de PWM-timing in de problemen komen. Dat kan leiden tot een te lage resolutie en teveel jitter, omdat het OS het PWM-programma kan onderbreken om Tabel 1. Pinbezetting van de uitbreidingsconnector Naam Functie Alternatief RPi.GPIO P1-02 5,0V - - P1-04 5,0V - - P1-06 GND - - P1-08 GPIO14 UART0_TXD RPi.GPIO8 P1- GPIO15 UART0_RXD RPi.GPIO P1-12 GPIO18 PWM0 RPi.GPIO12 P1-14 GND - - P1-16 GPIO23 RPi.GPIO16 P1-18 GPIO24 RPi.GPIO18 P1-20 GND - - P1-22 GPIO25 RPi.GPIO22 P1-24 GPIO8 SPI0_CE0_N RPi.GPIO24 P1-26 GPIO7 SPI0_CE1_N RPi.GPIO26 Naam Listing 1. LED dimmen #!/usr/bin/python import wiringpi2 as gpio import time #set up gpio gpio.wiringpipisetupgpio () gpio.pinmode (18,2) while True: Board Revision 1 Board Revision 2 Functie Alternatief Functie Alternatief P1-01 3,3V - 3,3V - P1-03 GPIO0 I2C0_SDA GPIO2 I2C1_SDA P1-05 GPIO1 I2C0_SCL GPIO3 I2C1_SCL P1-07 GPIO4 GPCLK0 GPIO4 GPCLK0 P1-09 GND - GND - P1-11 GPIO17 RTS0 GPIO17 RTS0 P1-13 GPIO21 GPIO27 P1-15 GPIO22 GPIO22 P1-17 3,3V - 3,3V - P1-19 GPIO SPI0_MOSI GPIO SPI0_MOSI P1-21 GPIO9 SPI0_MISO GPIO9 SPI0_MISO P1-23 GPIO11 SPI0_SCLK GPIO11 SPI0_SCLK P1-25 GND - GND - Opmerking: I2C0_SDA, I2C0_SCL (GPIO0 & GPIO1), I2C1_SDA en I2C1_SCL (GPIO2 & GPIO3) hebben pullup-weerstanden van 1k8 naar 3,3 V. gpio.pwmwrite (18,0) for n in range (0,24): gpio.pwmwrite (18,n) time.sleep (0.01) elektor post Project No. 20 2

andere dingen te draaien. Dat kan lastig zijn als we grote nauwkeurigheid en weinig jitter nodig hebben. Gelukkig heeft de Pi meerdere Direct Memory Access (DMA) kanalen in hardware, die kunnen helpen om een hardware-timing te creëren voor onze software-pwm. Omdat de DMA onafhankelijk van de CPU werkt, kunnen we de timing toch besturen met hardware en is de kans op onderbreking door het OS kleiner. Op die manier zijn de nauwkeurigheid en de jitter te verbeteren. EN1 EN2 R1 R2 T1 T2 M T3 T4 R3 EN3 R4 EN4 130381-11 Figuur 1. Schema van een H-brug. Figuur 2. De PiiBOT, een robot op vier wielen. Besturing van gelijkspanningsmotoren Een andere bekende toepassing van PWM is het besturen van de snelheid van een elektrische motor. Met de H-brug-schakeling in figuur 1 kunnen we een motor in beide richtingen laten draaien, maar als we een PWM-signaal gebruiken om één van de kwadranten aan te sturen, kunnen we ook de snelheid regelen. PiiBOT: De deegroller In figuur 2 zien we de PiiBOT. Dit is een robot met vier wielen, die op afstand wordt bediend met een Nintendo Wii. Deze robot heeft twee chips van het type L293D waarmee vier kleine gelijkspanningsmotoren worden aangestuurd en een Bluetooth USBdongle voor het ontvangen van de commando s van de Wii. Figuur 3. Schema van de opsteekprint voor het besturen van de motoren van de PiiBOT. C8 C2 C1 C7 3V3 GPIO4 C15 C9 C C16 K4 K2 3 6 9 OUT1 OUT2 S U1 8 EN1 IN1 IN2 1 2 7 K1 1 2 3 4 5 6 7 8 9 11 12 1 2 7 EN1 IN1 IN2 8 U2 9 S OUT1 OUT2 3 6 J1 K5 K3 11 14 IN3 OUT3 L293D OUT4 IN4 EN4 15 16 13 14 15 16 17 18 19 20 21 22 15 16 IN3 IN4 EN4 OUT3 L293D OUT4 11 14 K6 23 24 13 12 5 4 25 26 4 5 12 13 C6 C5 C4 C3 C11 C12 C13 C14 130381-13 elektor post Project No. 20 3

Tabel 2. Gebruik van de GPIO-lijnen IN1 2 EN1 1 IN2 9 OUT1 3 OUT2 OUT3 13 8 18 OUT4 S 20 4, 5, 6, 7, 14, 15, 16, 17 GND Figuur 4. De L293D motorbesturingschip. 12 IN3 11 EN2 19 IN4 130381-14 Motoren 1 en 2 (U1 L293D) De schakeling Onze motorregelaar is opgebouwd als een opsteekprintje voor de Raspberry Pi [2]. Het schema is te zien in figuur 3. Het bevat twee L293D-chips. De L293D heeft zich al bewezen in veel projecten met kleine motoren. Hij bevat twee complete H-brug-drivers, die elk 600 ma kunnen leveren (piekstromen tot 1,2 A) en is heel gemakkelijk Motoren 3 en 4 (U2 L293D) Motorfunctie GPIO Motorfunctie GPIO EN1 GPIO17 EN1 GPIO7 IN1 GPIO18 IN1 GPIO8 IN2 GPIO27 IN2 GPIO9 EN2 GPIO24 EN2 GPIO IN3 GPIO22 IN3 GPIO25 IN4 GPIO23 IN4 GPIO11 Installeren van de Bluetooth-drivers en de CWii-library voor Python Figuur 5. De Python-shell. Om de Nintendo Wii-controller te kunnen gebruiken, moeten we eerst de Bluetooth-drivers voor de USB-Bluetoothmodule installeren. We hebben alleen eenvoudige Bluetoothcommunicatie nodig, daarom geven we de optie --no-installrecommends mee bij het onderstaande commando: sudo apt-get install --no-install-recommends bluetooth Plug de Bluetooth-dongle in de Pi en test de interface met: sudo service bluetooth status Als alles in orde is, krijgen we het volgende resultaat: [ ok ] bluetooth is running. Als de Bluetooth-drivers zijn geïnstalleerd, kunnen we CWii [4], de Python Wii-library, downloaden. Geef de volgende commando s: sudo apt-get install python-cwiid Figuur 6. De IDLE-editor met het script piibot.py. Als alles is geïnstalleerd, kunnen we de Wii-controller gebruiken met onze Pi, in dit geval voor de PiiBOT. Meer informatie over het lezen van data van zo n controller is te vinden onder [5]. elektor post Project No. 20 4

aan te sturen. Elke H-brug heeft een enable-signaal (EN1/2) en twee inputs (IN1/3 en IN2/4) die de draairichting besturen (zie figuur 4). Op connector K4 kan een externe voeding (4,5 V tot 36 V gelijkspanning) worden aangesloten. Met jumper J1 kan ook worden gekozen om te motoren te voeden uit de 5-V-voeding van de Pi, maar dat is niet aan te raden. Kies liever voor een aparte voeding via K4. Per L293D-chip zijn zes GPIO-lijnen nodig voor de besturing, dus in totaal gebruiken we 12 GPIO-lijnen van de Pi voor het besturen van de vier wielen. Een overzicht van al die signalen is weergegeven in tabel 2. We sturen de enable-lijnen aan met PWM om de snelheid te regelen. Omdat er vier enable-signalen zijn, gebruiken we vier software-pwm-kanalen. Voorbeeldprogramma: piibot.py Als de schakeling is gebouwd, zijn we bijna klaar om het besturingsprogramma te schrijven in Python. Maar eerst moeten we nog de drivers en library s voor de Nintendo Wii-controller installeren. Hoe dat gaat, wordt beschreven in een apart tekstkader. Dubbelklik het pictogram IDLE op het bureaublad van de Pi om de Python-shell en -IDE te starten (zie figuur 5). Kies nu de optie File in het menu en maak een nieuw programma. Dit start de IDLEeditor (figuur 6). Voer hiermee het programma in listing 2 in. Het is nogal lang, maar gelukkig kan het ook worden gedownload van de ondersteuningspagina over de Raspberry Pi-serie bij Elektor.LABS [3]. Vergeet niet het programma op te slaan na het intikken. Daarna schakelen we over naar LXTerminal. Geef het volgende commando om het programma uitvoerbaar te maken: chmod +x piibot.py Start dan het programma met: sudo./piibot.py Het programma vraagt ons dan om de Wiicontroller te paren met de Pi. Druk de knoppen 1 en 2 op de Wii-controller tegelijk in om dat te doen. Als de controller is gepaard, kan onze PiiBOT aan de rol! Weblinks [1] WiringPi GPIO Library: http://wiringpi.com [2] MiniPiio Motor293D-opsteekprint: www.dtronixs.com (130381) [3] Raspberry Pi-ondersteuningspagina s bij Elektor.LABS: www.elektor-labs.com/rpi [4] CWiid-library voor de Nintendo Wii-controller: http://abstrakraft.org/cwiid/ [5] Nintendo Wii Remote, Python en de Raspberry Pi: http://bit.ly/rpi-wii Listing 2: piibot.py (download dit programma van [3]) #!/usr/bin/python import RPi.GPIO as GPIO import cwiid import time M1_EN1 = 24 M1_IN1 = 23 M1_IN2 = 22 M2_EN1 = 17 M2_IN1 = 18 M2_IN2 = 27 M3_EN1 = 7 M3_IN1 = 8 M3_IN2 = 9 M4_EN1 = M4_IN1 = 25 M4_IN2 = 11 speed = 40 def Motor_Setup (): print Setting up.. elektor post Project No. 20 5

GPIO.setwarnings (False) # Configure GPIO GPIO.setmode (GPIO.BCM) GPIO.setup (M1_EN1, GPIO.OUT) GPIO.setup (M1_IN1, GPIO.OUT) GPIO.setup (M1_IN2, GPIO.OUT) GPIO.setup (M2_EN1, GPIO.OUT) GPIO.setup (M2_IN1, GPIO.OUT) GPIO.setup (M2_IN2, GPIO.OUT) GPIO.setup (M3_EN1, GPIO.OUT) GPIO.setup (M3_IN1, GPIO.OUT) GPIO.setup (M3_IN2, GPIO.OUT) GPIO.setup (M4_EN1, GPIO.OUT) GPIO.setup (M4_IN1, GPIO.OUT) GPIO.setup (M4_IN2, GPIO.OUT) print ready def Motor_Forward (speed): print Forward, speed =, speed GPIO.output (M1_IN1, True) pwm1.changedutycycle(speed) # M1 EN1 GPIO.output (M2_IN1, True) pwm2.changedutycycle(speed) # M2 EN1 GPIO.output (M3_IN1, True) pwm3.changedutycycle(speed) # M3 EN1 GPIO.output (M4_IN1, True) pwm4.changedutycycle(speed) # M4 EN1 def Motor_Right (speed): print Right, speed =, speed GPIO.output (M1_IN1, True) pwm1.changedutycycle(speed) pwm2.changedutycycle(0) GPIO.output (M3_IN1, True) pwm3.changedutycycle(speed) pwm4.changedutycycle(0) def Motor_Left (speed): print Left, speed =, speed pwm1.changedutycycle(0) GPIO.output (M2_IN1, True) pwm2.changedutycycle(speed) pwm3.changedutycycle(0) GPIO.output (M4_IN1, True) pwm4.changedutycycle(speed) def Motor_Reverse (speed): print Reverse, speed =, speed GPIO.output (M1_IN2, True) pwm1.changedutycycle(speed) GPIO.output (M2_IN2, True) pwm2.changedutycycle(speed) GPIO.output (M3_IN2, True) pwm3.changedutycycle(speed) GPIO.output (M4_IN2, True) pwm4.changedutycycle(speed) def Motor_Stop (): pwm1.changedutycycle(0) pwm2.changedutycycle(0) pwm3.changedutycycle(0) pwm4.changedutycycle(0) # Main Program Motor_Setup () pwm1 = GPIO.PWM (M1_EN1, 0) pwm2 = GPIO.PWM (M2_EN1, 0) elektor post Project No. 20 6

pwm3 = GPIO.PWM (M3_EN1, 0) pwm4 = GPIO.PWM (M4_EN1, 0) pwm1.start (0) pwm2.start (0) pwm3.start (0) pwm4.start (0) if (buttons & cwiid.btn_down): Motor_Reverse (speed) Motor_Stop () button_delay = 0.1 print Press 1 + 2 on your Wii Remote time.sleep(1) if (buttons & cwiid.btn_minus): speed = speed - 1 if (speed < 0): speed = 0 print speed =, speed # Connect to the Wii Remote try: wii=cwiid.wiimote() except RuntimeError: print Error Connecting to Wii Remote quit() if (buttons & cwiid.btn_plus): speed = speed + 1 if (speed > 0): speed = 0 print speed =, speed print Wii Remote connected wii.rpt_mode = cwiid.rpt_btn # Loop try: while True: buttons = wii.state[ buttons ] stop = True if (buttons & cwiid.btn_left): Motor_Left (speed) if(buttons & cwiid.btn_right): Motor_Right(speed) if (buttons & cwiid.btn_up): Motor_Forward (speed) if (stop == True): Motor_Stop () except KeyboardInterrupt: pass print End GPIO.output (M1_EN1, False) GPIO.output (M2_EN1, False) GPIO.output (M3_EN1, False) GPIO.output (M4_EN1, False) pwm1.stop () pwm2.stop () pwm3.stop () pwm4.stop () GPIO.cleanup exit (wii) elektor post Project No. 20 7