Raspberry Pi Funksensoren und Empfänger selber bauen – Teil 3 Sender bauen

Erstellt am 20. November 2014 von At2oo1

Anleitung zum Selbstbau Übersicht

  • Teil 1 Projekt Info
  • Teil 2 Einkaufsliste
  • Teil 3 Funksender bauen (Dieser Artikel)
  • Teil 4 Funkempfänger bauen
  • Teil 5 Inbetriebnahme und Test
  • Teil 6 Anzeige der Daten via Web und via App
  • Zusatz – Sender PCB Version

Den Sender Chip Programmieren (ATtiny 84)

Als erstes müssen wir den Chip für den Funksender entsprechend programmieren (auch Flashen oder Brennen genannt). Da wir zum Glück einen Raspberry Pi haben können wir das Programm über den Raspberry Pi auf den Chip brennen. Hier eine logische Ansicht auf den ATtiny, achtet beim Verkabeln darauf das die PINs richtig zugeordnet werden, erkennen könnt ihr das an der Kerbe auf dem Chip.

Wir verkabeln den ATtiny 84 entsprechend dieser Zuordnungstabelle mit unserem Raspberry Pi, diese Zuordnung kann sowohl für das Modell B als auch für den A+ und B+ verwendet werden. Schaltet euren Raspberry Pi zum Verkabeln aus! Ich verwende der Einfachheit halber ein Breadboard mit GPIO Breakout.

Sobald die Verkabelung abgeschlossen ist können wir mit der Einrichtung der Software auf dem Raspberry Pi befassen. Wir installieren erst via apt vorhandene Updates und alle notwendigen Tools. Alleine die Arduino Entwicklungsumgebung hat ca. 80MB, die Installation dauert also etwas.

sudo apt-get -y update & sudo apt-get -y upgrade
sudo apt-get install -y arduino git-core gcc-avr lxde xrdp

Wir benötigen noch zwei zusätzliche Softwarepakete die sich nicht im Raspbian Repository befinden, daher laden wir uns diese via wget runter und installieren sie via dpkg. Avrdude ist die Programmiersoftware für den Atmel ATtiny Chip.

sudo su
wget http://cdn.raspberry.tips/2014/11/avrdude_5.10-4_armhf.deb
wget http://cdn.raspberry.tips/2014/11/avrdude-doc_5.10-4_all.deb

dpkg -i avrdude_5.10-4_armhf.deb
dpkg -i avrdude-doc_5.10-4_all.deb

Dann legen wir uns einige Arbeitsverzeichnisse an, und clonen uns dort via git die Libraries für das RFM12 Modu, JeeLib (Treiber für Wireless Module) sowie die OneWire Library für das OneWire Protokoll und eine Temperatur Library für DS18B2x Sensoren. Die Libraries verwenden wir später in unserem Programm welches wir auf den ATtiny Chip schreiben.

sudo su
mkdir -p /root/sketchbook/hardware/tiny/variants/tiny8
mkdir -p /root/sketchbook/hardware/tiny/variants/tiny14
mkdir -p /root/sketchbook/libraries
mkdir -p /root/sketchbook/libraries/ArduinoTemperatureControl
mkdir -p /usr/share/arduino/hardware/arduino/
mkdir -p /root/sketchbook/libraries/DHT22

git clone https://github.com/LowPowerLab/RFM12B /root/sketchbook/libraries/RFM12B
git clone https://github.com/jcw/jeelib /root/sketchbook/libraries/JeeLib
git clone https://github.com/milesburton/Arduino-Temperature-Control-Library.git /root/sketchbook/libraries/ArduinoTemperatureControl/
git clone https://github.com/nethoncho/Arduino-DHT22 /root/sketchbook/libraries/DHT22

wget -O/root/sketchbook/libraries/OneWire.zip http://cdn.raspberry.tips/2014/11/OneWire.zip
unzip /root/sketchbook/libraries/OneWire.zip -d /root/sketchbook/libraries/ 
rm /root/sketchbook/libraries/OneWire.zip
wget -O/usr/share/arduino/hardware/arduino/programmers.txt http://cdn.raspberry.tips/2014/11/programmers.txt

Nun holen wir uns noch die Kernkomponenten des ATtiny Chips, diese benötigen wir das unser Programm (Sketch) später auf dem Chip überhaupt lauffähig ist. Darin enthalten ist der Bootloader des Chips und die PIN Definitionen.

sudo su
cd /root/sketchbook/hardware/
wget http://cdn.raspberry.tips/2014/11/arduino-tiny-0150-0018.zip
unzip arduino-tiny-0150-0018.zip 
rm arduino-tiny-0150-0018.zip
cd tiny & [ -d avr ] & cd avr; mv -f * ../; cd ..; rm -rf avr

wget -O/root/sketchbook/hardware/tiny/boards.txt http://cdn.raspberry.tips/2014/11/boards.txt
wget -O/root/sketchbook/hardware/tiny/variants/tiny8/pins_arduino.h http://cdn.raspberry.tips/2014/11/pins_arduino.h
wget -O/root/sketchbook/hardware/tiny/variants/tiny14/pins_arduino.h http://cdn.raspberry.tips/2014/11/pins_arduino-2.h
wget -O/root/sketchbook/libraries/RFM12B/RFM12B.h http://cdn.raspberry.tips/2014/11/RFM12B.h

Dann benötigen wir noch die “Sketches” für unseren Sender, das ist der eigentliche Programm Code der auf dem ATtiny ausgeführt wird. Die Entwicklungsumgebung “ArduinoIDE”, welche wir vorher installiert haben, sucht im Standard im Verzeichnis “/usr/share/arduino/” nach passenden Sketches, daher laden wir diese dort hin. Falls ihr einen anderen Sensor verwendet müsst ihr die URL im Wget Befehl entsprechend anpassen, ich verwende den DHT22.

  • DHT22 – http://cdn.raspberry.tips/2014/11/Send_DHT22.ino
  • DS18B20 – http://cdn.raspberry.tips/2014/11/Send_DS18B20.ino
  • Empfänger – http://cdn.raspberry.tips/2014/11/Receiver_PI.ino
sudo mkdir -p /usr/share/arduino/Send/
sudo wget -O/usr/share/arduino/Send/Send.ino http://cdn.raspberry.tips/2014/11/Send_DHT22.ino

Testet noch ob euer ATtiny auch wirklich richtig verkabelt ist, dabei hilft uns der folgende Befehl, dieser muss avrdude: AVR device initialized and ready to accept instructions zurückgeben

avrdude -P gpio -c gpio -p attiny84

 Den ATtiny Programmieren

Um den IC programmieren zu können müssen wir die ArduinoIDE aufrufen, allerdings ist dies nur auf der grafischen Oberfläche möglich. Falls ihr aufmerksam wart habt ihr vielleicht bemerkt das sich bei der Installation der Software ein xrdp untergemogelt hat, dieses verwende ich um von meinem Windows Rechner eine Remoteverbindung zum Raspberry Pi aufzubauen. Als alternative könnt ihr auch VNC benutzen oder direkt mit Bildschirm, Tastatur un Maus am RasPi arbeiten. Vergesst nicht via “raspi-config” den Statmodus auf “Desktop” umzustellen und den RasPi einmal neu zu starten.

WICHTIG!
Ihr müsst unbeding bevor ihr mit dem Programmieren startet noch die UART Schnittstelle aktivieren.

Ich arbeite als Root auf meinem Desktop und verwende daher /root/sketchbook für die IDE als Ordner worin wir alle wichtigen Dateien gelegt haben. Falls ihr als Pi arbeitet müssen diese mit passendem Owner in eurem Home liegen.

Wir finden die Entwicklungsumgebung ArduinoIDE dann im Startmenu unter “Electronics”. Wir starten das Tool (das dauert einige Sekunden).

Wir öffnen die das Programm “Send.ino” welches wir vorher nach “/usr/share/arduino/Send/Send.ino” kopiert habe. Den öffnen Dialog findet ihr im File Menu unter Open.. klickt dort auf File System und navigiert in den Ordner und öffnen die Send.ino

Achtung!
Wenn ihr mehrere Sender programmiert müssen diese mit einer jeweils andere NETWORKID besitzen sodass der Empfänger dies unterscheiden kann. Hierzu müsst ihr in der Send.ino die Definition für die Netzwork ID anpassen. Ebenfalls muss die GATEWAYID übereinstimmen. Die Definition findet ihr im oberen bereich. Schreibt euch die IDs am besten auf die Platine bzw. mit einem Klebezettel auf den Chip!

Hier die anpassbaren Definitionen:

#define NODEID         20  //network ID used for this unit
#define NETWORKID     210  //the network ID we are on
#define GATEWAYID      22  //the node ID we're sending to
#define ACK_TIME     2000  // # of ms to wait for an ack
#define SENDDELAY   300000 // wait this many ms between sending packets. 300000ms = 5min
#define requestACK  false  // request ACK? (true/false)

Dann in der ArduinoIDE auf das Menü Tools -> Board gehen und dort ATtiny84 (internal 8 MHz clock) auswählen

Wieder über das Menü Tools  den Bootloader installieren – Burn Bootloader 

Auf das Menü File -> Preferences gehen und dort einstellen: Show verbose output during: [x] compilation

Wir starten nun die Überprüfung und die Erstellung unseres Programms, dazu klicken wir im Menu auf Sketch > Verify / Compile

Das Erstellen dauert einige Sekunden, wenn alles funktioniert hat sehen wir im Ausgabefenster unten Done Compiling bei einem Fehler Error Compiling. Einige rote Warnmeldungen sind normal, ein Fehler sollte jedoch nicht auftauchen.

Die Entwicklungsumgebung hat uns nun das Programm (Sketch) als Hex File erstellt welches wir auf den Chip schreiben können. Wir wählen über Tools > Programmer noch unseren RasPi als Ziel (haben wir mit dem Download der Datei programmers.txt definiert).

Klickt abschließend auf File > Upload using Programmer um das Programm auf den Chip zu schreiben. ArduinoIDE meldet Done Uploading wenn alles geklappt hat.

Den Sender zusammenbauen

Das Stripboard Layout basiert auf dem Design von Nathan. Entsprechend eurem Sensor muss der Widerstand zwischen VCC (VDD) und DATA (DQ) entweder entfernt oder ausgetauscht werden. Details siehe Einkaufsliste. Bei meinem DHT22 tausche ich den 4,7k gegen einen 10k Widerstand und achte darauf die PIN richtig zuzuordnen.

 

Beim Zusammenbau des Senders wie folgt vorgegangen:

1. Platine zuschneiden

Die Platine für den Sender ist 16 x 15 Löcher.

2. Buchsenleiste für den Sensor auflöten

Die 10er Buchsenleiste habe ich mir einfach passend zugeschnitten

3. Stift für die Antenne auflöten(Klingeldraht geht auch direkt am Board)

4. Buchsenleiste für den Batterie Halter auflöten

5. Buchsenleiste für den RFM12B auflöten

6. Die mit  einem roten X markierten Leiter unterbrechen (durchschneiden / abschaben mit scharfem Messer / Cutter)

7. Auflöten des IC Sockels

8. Auflöten des RFM12B

Ein kleiner Tipp, wenn ihr Stiftleisten in euer Breadboard steckt, biegt und dann den Chip dazwischen klemmt könnt ihr einfach und sauber löten. Ihr bekommt das aber bestimmt schöner hin als ich, ich habe zwecks der Stabilität alle Beinchen angelötet (6 pro Seite), ihr könnt auch nur die benötigten 6 + 2 Pins anlöten um Material und Fummelei zu sparen.

  

9. Verkabeln mit Klingeldraht

Bei mir sieht das Ergebnis so aus, ich habe noch eine LED für den Status (für Tests ganz gut) eingelötet.

Zum Testen kann noch eine LED zwischen PIN11 (+) und PIN14 (-) eine LED aufgelötet werden, diese blinkt dann bei den entsprechenden Zeilen im Code.

Antenne

Als Antenne habe ich einen Kupferdraht benutzt den ich auf 165mm gekürzt habe. Dieser wird direkt an das RFM12 Board gelötet. Es ist auch möglich einen “Spirale” als Antenne zu benutzten die im Gehäuse Platz finden kann, das habe ich aber noch nicht ausprobiert und kann auch zu der Reichweite noch nichts sagen.