Beiträge getaggt mit Raspberry Pi
Elektrisch Programmieren 3: Der Pi Zero als ISP
Veröffentlicht von mnasarek in Assembler, Programmieren am 27. April 2017
Im letzten Teil der Serie ging es darum, wie der Programm-Code für den ATtiny aussieht. Da Assembler-Code am besten geeignet ist, um möglichst viel über die Abläufe des Mikrocontrollers zu erfahren, gab es auch eine kleine Einführung in Assembler für den ATtiny. In diesem Teil soll es darum gehen, wie man den Programm-Code in den Flash-Speicher des ATtiny lädt. Normalerweise programmiere ich im Amtel Studio. Damit ist die Verwaltung eines Projekts und die Einstellungen der Chip-spezifischen Konfiguration sehr einfach. Mit einem 886MB großen Installer wird damit allerdings mit Kanonen auf Spatzen geschossen. Ein guter Editor ist völlig ausreichend. Ich habe mir vor einiger Zeit eine Lizenz für Sublime Text zugelegt, da der sich super konfigurieren lässt, es geht natürlich auch mit vim oder irgendein anderer Editor der idealerweise gleich das kompilieren und debuggen unterstützt.
Ist der Code erstellt, braucht es eine Build-Umgebung. Da ich im Folgenden auf dem RasPi entwickele, nutze ich dafür die gcc Werkzeuge und den avra Assembler. Also werden sie und mein auf dem Pi bevorzugter Editor vim auf dem RasPi installiert:
sudo apt-get install gcc-avr binutils-avr avr-libc avra vim
Der avra Assembler bringt die Include-Files mit, die am Anfang des Quell-Codes des Beispielprogramms geladen werden. Dabei stellt sich heraus, dass es einen Unterschied zum avra aus dem AVR Studio gibt: Es gibt nur eine Include-Datei zum ATtiny45 tn45def.inc die vom Inhalt her zwar identisch sein mit der tn85def.inc sollte, jedoch fehlt die Datei tn85def.inc im include-Verzeichnis. Und dann enthält diese Datei ausgerechnet einen Bug beim Bezeichner des OCIE1A-Bits. Also habe ich die Datei /usr/share/avra/tn45def.inc einfach in eine neue Datei /usr/share/avra/tn85def.inc kopiert und in der Zeile 451 die Bezeichnung OCE1A zu OCIE1A korrigiert. Hier die Datei tn85def.inc auf gitHub.com.
Ist der Quell-Code des Timer-gesteuerten Blink-Programms erstellt, kann er kompiliert werden:
avra -fI -I /usr/share/avra -o TimerBlink.hex TimerBlink.asm
Nun haben wir die hex-Datei, die in den ATtiny geladen werden kann. Eigentlich braucht es dafür einen ISP, einen In-System Programmer für Mikrocontroller. Ich nutze bisher dafür den USBasp, den es ab ca. 5€ im Internet zu kaufen gibt:
Allerdings geht es mit dem RasPi viel einfacher, da der ja eine SPI-Schnittstelle mitbringt. Die muss nur mit Hilfe des Konfigurationsprogramms raspi-config unter Interfacing Options aktiviert werden. Und das Tool avrdude braucht nicht mehr, um den Code in den ATtiny zu laden. Die Verdrahtung ist sehr einfach. Dazu werden nur die Pins für den SPI-Port des Pi mit dem SPI-Port des ATtiny verbunden:
- SCLK: Pi GPIO11 -> ATtiny Pin 7
- MISO: Pi GPIO9 -> ATtiny Pin 6
- MOSI: Pi GPIO10 -> ATtiny Pin 5
- RESET: Pi GPIO25 -> ATtiny Pin 1
- VCC: Pi 3V3 -> ATtiny Pin 8
- GND: Pi GND -> ATtiny Pin 4
Durch die Nutzung des SPI-Ports braucht die Programmer-Software nur noch zu wissen, welches System genutzt wird, um dem GPIO-Port für RESET richtig anzusprechen. In der Konfiguration ist bereits das Gerät linuxspi hinterlegt, das über das Device /der/spidev0.0 angesprochen wird. Damit könnte es nach der Installation von avrdude schon losgehen:
sudo apt-get install avrdude
Doch die Baudrate 400000 in der Standard-Konfiguration ist für den Pi viel zu hoch. Daher habe ich mir die Datei ~/.avrduderc im Home-Verzeichnis mit folgendem Inhalt erstellt:
programmer id = "pizero"; desc = "Use a Raspberry Pi Zero as ISP via /dev/spidev0.0"; type = "linuxspi"; reset = 25; baudrate = 100000; ;
Noch schnell den Benutzer pi in die richtigen Gruppen hinzugefügt:
sudo usermod pi -a -G spi,gpio
Nun kann ich die Programmer-Konfiguration direkt mit avrdude nutzen und die hex-Datei in den ATtiny laden:
pi@zero:~/TimerBlink $ avrdude -c pizero -p t85 -P /dev/spidev0.0 -U flash:w:TimerBlink.hex avrdude: AVR device initialized and ready to accept instructions Reading | ################################################## | 100% 0.00s avrdude: Device signature = 0x1e930B avrdude: NOTE: "flash" memory has been specified, an erase cycle will be performed To disable this feature, specify the -D option. avrdude: erasing chip avrdude: reading input file "TimerBlink.hex" avrdude: input file TimerBlink.hex auto detected as Intel Hex avrdude: writing flash (108 bytes): Writing | ################################################## | 100% 0.09s avrdude: 108 bytes of flash written avrdude: verifying flash memory against TimerBlink.hex: avrdude: load data flash data from input file TimerBlink.hex: avrdude: input file TimerBlink.hex auto detected as Intel Hex avrdude: input file TimerBlink.hex contains 108 bytes avrdude: reading on-chip flash data: Reading | ################################################## | 100% 0.07s avrdude: verifying ... avrdude: 108 bytes of flash verified avrdude: safemode: Fuses OK (E:FF, H:DF, L:62) avrdude done. Thank you. pi@zero:~/TimerBlink $
Und nun blinkt es Timer-gesteuert und stromsparend Interrupt-geweckt:
Internetbasiertes FM-Radio – Teil 3: Serielle Datenübertragung zwischen RasPi und Arduino
Veröffentlicht von mnasarek in Allgemein, Programmieren am 22. September 2015
In Teil 2 wurde das python-Skript für die Erstellung der Senderliste vorgestellt. Für die Übertragung der Senderliste an den Arduino eignet sich die serielle Schnittstelle perfekt. Sie ist ja für die Kommunikation von lesbaren Zeichenfolgen geschaffen, daher sollte die Übermittlung einer Liste mit Sendernamen und Frequenzen kein Problem sein. Der Teufel ist jedoch ein Eichhörnchen und die Herausforderung einer seriellen Schnittstelle findet sich in den Details. Den Rest des Beitrags lesen »
Internetbasiertes FM-Radio – Teil 2: Geolokation und Screen-Scraping
Wie in Teil 1 bereits kurz erklärt, soll das Arduino-Radio mit dem TEA5767-FM-Chip die UKW-Senderliste passend zum eigenen Standort automatisch erhalten. Im ersten Schritt wird daher zunächst versucht, den eigenen Standort zu bestimmen. Dafür braucht es keinen GPS-Sensor. Schon die IP-Adresse liefert hinreichend gut den Standort, zumindest auf einige Kilometer genau. Das genügt, um die Radio-Sendemasten in der Nähe zu finden. Hinweise darüber liefert die Webseite fmscan.org: Die Seite listet für einen beliebigen Ort die empfangbaren Radiosender auf.
Für die Standortbestimmung per IP-Adresse gibt es einige Web-Datenbanken. Viele davon können kostenlos genutzt werden. So ganz zuverlässig ist das Ganze nicht, besonders, wenn der Internetanschluss von einem internationalen Anbieter genutzt werden. Ob es funktioniert, muss man einfach ausprobieren. Ein Dienst, der bei mir gut funktioniert hat, ist ip-api.com. Der Dienst liefert ausführliche Informationen zum Standort der abgefragten IP-Adresse und gibt sie auf Wunsch im JSON Format zurück. Das Format hat den Vorteil, dass es die Daten lesbar und in strukturierter Form vorhält. Mit einer entsprechenden Parser-Bibiliothek ist es sehr einfach, die Daten aus einer JSON-Datei in Skripten zu verwenden. Den Rest des Beitrags lesen »
Internetbasiertes FM-Radio – Teil 1: Worum geht’s?
Internetbasiertes WAS? Das Internet braucht man eigentlich nicht, wenn der TEA5767 zum Tönen gebracht werden soll. Der TEA5767 passt auf eine Fingerspitze und enthält einen komplettes FM-Radio. Es muss nur die entsprechende Sendereinstellung in das Register geladen werden und schon gibt der Chip über den Stereo-Ausgang den Sound aus. Zudem verfügt der TEA5767 über einen automatische Sendersuchlauf und kann sich so per Knopfdruck von Sender zu Sender hangeln. Also wozu Internet? Weil das Internet alles weiß. Es weiß, wo man sich gerade befindet, welche UKW-Sendemasten in der Nähe stehen und welche Signalstärke am eigenen Standort ankommen müsste. Smartes Lokal-Radio also. Den Rest des Beitrags lesen »
XBee und Raspberry Pi im Raspberry-Pi-Geek Magazin
Veröffentlicht von mnasarek in Netzwerk, Programmieren am 7. Juni 2015
04/2015 RasPi im Netz: Mein Artikel über die Zusammenarbeit von Xbee-Modulen mit dem Raspberry Pi ist im akuellen Heft des Raspberry-Pi-Geek Magazin erschienen.
XBee-Module sind kleine Funkmodule, die Sensornetzwerk aufspannen und automatisch verwalten können. Da sie per serieller Schnittstelle kommunizieren sind die bestens für das Zusammenspiel mit dem RasPi geeignet. Der Artikel führt in die Grundlagen der Arbeit mit XBee-Modulen ein und zeigt wie man Messwerte erfasst und mit dem RasPi auswertet. Das Heft gibt es für 7,99 Eur als PDF: http://www.raspberry-pi-geek.de/Magazin/2015/04 oder am Kiosk.
Meine Smartwatch :-) Mit I2C ein OLED-Display ansteuern
Für gerade einmal 10 € gibt es ein 0,96 zoll Display mit einer Auflösung von 128×64 Pixel zum Beispiel bei amazon. Das Display ist groß genug, um kleine Grafiken und Benachrichtigungen anzuzeigen. Mein Display ist ein chinesisches Produkt, angepriesen als 100 % kompatibel zum Original von Adafruit und daher wohl 100% kompatibel zur Adafruit-Bibliothek Adafruit_SSD1306.h für den Arduino. Es wird mit 5V betrieben und verfügt über eine I2C-Schnttstelle. Die Orignal-Displays gibt es mit I2C und SPI-Schnittstelle (siehe SSD1306 OLED Displays with Raspberry Pi and BeagleBone Black – englisch). Den Rest des Beitrags lesen »
WLAN auf der Kommandozeile einrichten
Veröffentlicht von mnasarek in Grundlagen, Netzwerk am 21. Dezember 2014
Es ist sehr leicht, den RasPi per Kabel ans Netzwerk zu bekommen (siehe dazu „Ans Netz!„). Die Netzwerkkonfiguration läuft bei Anschluss des LAN-Kabels automatisch und nach ein paar Sekunden ist der RasPi per SSH erreichbar. Ganz so einfach ist es mit WLAN nicht,denn das WLAN-Passwort muss schließlich irgendwo eingegeben werden. Um auf den Anschluss von Monitor und Tastatur verzichten zu können, konfiguriere ich den RasPi per USB-Serial-Adapter. Wie das geht, habe ich im Beitrag „Ein Terminal über die seriellen Ports“ gezeigt. Zur Erinnerung: Ihr braucht einen USB-Serial-Adapter wie es ihn für ein paar Euro im Internet gibt. Beim Anschluss solltet Ihr darauf achten, dass der RX-Anschluss des Adapters an den TX-Pin vom RasPi kommt und der TX-Anschluss des Adapters an den RX-Pin des RasPi. Denn was der eine sendet (TX) soll der andere ja empfangen (RX). Am TX-Anschluss sollten außerdem höchstens 3.3 V anliegen, da sonst der RX-Pin des RasPi zu viel Spannung abbekommt. Den 5V-Anschluss schließt Ihr nicht an, wenn der RasPi selbst schon mit Strom versorgt wird. Den Rest des Beitrags lesen »
Analoge Messwerte mit einem ADC über SPI auslesen
Veröffentlicht von mnasarek in Programmieren am 4. November 2014
Elektronische Sensoren geben die erfassten Messwerte auf unterschiedliche Weise an den Empfänger weiter. Einige Sensoren verändern eine Spannung oder einen Stromfluss, je nach Messwert. Ein Fotowiderstand lässt zum Beispiel mehr oder weniger Strom durch, je nachdem wie viel Licht auf den Sensor trifft. Einige andere Sensoren geben die Messwerte als Datenpakete weiter. Dafür benutzen sie spezielle Schnittstellen, wie den i2c-Bus oder SPI. Signale, die auf diese Weise in Bits und Bytes übersetzt werden, nennt man digitale Messwerte.
Eine Echtzeituhr mit dem i2c-Bus anprogrammieren
Veröffentlicht von mnasarek in Grundlagen am 30. Oktober 2014
Viele Sensoren und Microntroller unterstützen den i2c-Bus. Dieser Bus hat den Vorteil, dass nur zwei Drähten zur Kommunikation aller Teilnehmer benötigt werden. Dadurch kann ein so genannter Bus-Master über 100 Microcontroller (Slaves) im Zaum halten. Das Protokoll ist so verbreitet, dass zur Programmierung inzwischen zahlreiche Bibliotheken zur Verfügung stehen.
Den Rest des Beitrags lesen »
Die serielle Schnittstelle (UART) in Skripten programmieren
Veröffentlicht von mnasarek in Grundlagen am 19. August 2014
In meinem letzten Beitrag habe ich den neuen GPIO-Header des RasPi B+ beschrieben. In der Übersicht zur Belegung der Pins habe ich die Pins hervorgehoben, die über eine Sonderbelegung verfügen. Im Einzelnen sind das die Pins für I2C, UART und SPI. Hier ein kurzer Überblick, was hinter diesen Bezeichnungen steckt: