Metainformationen zur Seite
Dies ist eine alte Version des Dokuments!
Matrix
Ziel ist es eine über den Arduino laufende LED-Matrix über die serielle Schnittstelle zum Raspberry Pi über Internet zu programmieren.
Arduino Programm
Dazu wird das Arduino Programm (RaspberryPi mit Arduino koppeln) an ein weiteres Programm, welches eine Laufschrift anzeigen lässt angepasst:
const int zeilenstart=2; // Pin ab dem die Zeilen anfangen const int spaltenstart=10; // Pin ab dem die Spalten anfangen const int max_x=8; // maximal zu übergebende Werte int i = 0; // seriell übergebener Wert int q = 0; // int modus=0; int schrift[max_x]={1,2,4,8,16,32,64,128}; // Anfangsdiagonale int pot[8]={1,2,4,8,16,32,64,128}; // Zweierpotenzen // -------------------------------------------------- void show_grid() { for (int s=0;s<8;s++) { // für jede Spalte for (int z=0;z<8;z++) { // und für jede Zeile if ( (schrift[s] & pot[z]) == pot[z]) // schrift[] auf der Matrix ausgeben digitalWrite(zeilenstart+z,LOW); else digitalWrite(zeilenstart+z,HIGH); } digitalWrite(spaltenstart+7-s,HIGH); digitalWrite(spaltenstart+7-s,LOW); } } // -------------------------------------------------- void setup () { Serial.begin(9600); // serielle Schnittstelle starten for (int i=0; i<8; i++) { pinMode(zeilenstart+i, OUTPUT); // Pins als Ausgang nutzen pinMode(spaltenstart+i, OUTPUT); // Pins als Ausgang nutzen digitalWrite(zeilenstart+i,HIGH);// Die Zeile ausschalten digitalWrite(spaltenstart+i,LOW);// Die Spalte ausschalten } } void loop () { if (Serial.available() > 0) { // wenn serielle Signale verfügbar sind: i = Serial.read(); // empfangene Signale lesen if ( modus==0 ) { //auf drei aufeinanderfolgende Nullen warten if ( i==0 ) { q++; //zählt aufeinanderfolgende Nullen } else { q=0; } if ( q==3 ) { modus=1; q=0; } // Bei dreimal 0: } else { schrift[q]=i; // schrift[] abhängig von i definieren q++; if ( q==8 ) { modus=0; q=0; } // Nach 8 Zeichen auf Startsignal warten } } else { show_grid(); // schrift[] auf Matrix ausgeben } }
Da der Arduino über weniger als 64 Ausgänge verfügt, die Matrix allerdings 64 LEDs besitzt, kann durch Umwandlung in das Binärsystem/Zweierpotenzen jede LED angesteuert werden.
Jede Spalte verfügt so über eine andere Spaltensumme, die das Arduinoprogramm als übergebene Parameter vom Raspberry Pi erwartet. Um einen Informationsbeginn zu deklarieren, muss dreimal eine 0 an den Anfang jeder Datenübertragung gesetzt werden.
Raspberry Pi Programme
Damit man nun nicht jedesmal die drei 0 an den Anfang setzen muss und der Raspberry Pi auch nur 8 Parameter übergibt wird das Programm für den Raspberry Pi aus „RaspberryPi mit Arduino koppeln“ ein wenig angepasst:
Parameterübergabe
import serial import time import sys delay = 0.01 comunicacion = serial.Serial('/dev/ttyAMA0', 9600) comunicacion.close() comunicacion.open() for a in [0,0,0]: comunicacion.write(chr( 0 )) time.sleep(delay) for a in range(1,9): comunicacion.write(chr( int(sys.argv[a]) )) time.sleep(delay)
Internetseite
Um das ganze übers Internet zu programmieren, benötigt man zunächst einmal einen Webserver auf dem Pi und eine php-Datei, die man in den Ordner /var/www speichert. (siehe Steuern über Website )
Über diese Internetseite kann man die benötigten Werte an das Python-Programm weiterreichen.
<?php $a = explode (",",$_GET["v"]); $anzahl = count ($a); if ($anzahl == 8){ foreach ($a as $k=>$v) { $a[$k]=(int)$v; } passthru("/usr/bin/python senden ".implode(" ",$a)); } else { echo 'Fehler bei der Eingabe!<br>Nicht genau 8 Werte!<br><br>Adresse muss folgende Form haben:<br><a href="?v=1,2,4,8,16,32,64,128 } ?>
erweiterte Internetseite
Da es auf Dauer wenig Spaß macht jedesmal die LEDs bzw. die Parameter auszurechnen, programmiert man sich kurz eine Internetseite, die das ganze durch anklicken einer virtuellen Martix für einen berechnet und sofort an über die anderen Programme (Internetseite, Parameterübergabe, etc.) an den Arduino bzw. die Matrix selbst weiterleitet. Davor muss man sich jedoch noch folgendes runterladen, um nicht über andere Server gehen zu müssen (Vgl. Blinken):
wget http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js
<!DOCTYPE html> <html> <head> <meta charset=utf-8 /> <meta name="viewport" content="width=device-width"> <script src="jquery.min.js"></script> <style> div.ha.an {background-color:blue;} div.ha {position:absolute; padding:30px; background-color:lightgrey; border-radius:100px} </style> <script> $(document).ready(function(){ $('body').empty(); for (var y=0; y<8; y++) { for (var x=0; x<8; x++){ $('<div></div>') .appendTo('body') .addClass('s'+x) .addClass('z'+y) .addClass("ha") .css({left:x*80, top:y*80}) .data("value",Math.pow(2,y)) .click(function(){ $(this).toggleClass('an'); var a=[0,0,0,0,0,0,0,0]; for(var i=0; i<8;i++){ $.each( $(".s"+i+".an"),function(ii,e){ a[i]+=$(e).data("value"); } ) } $.get('index.php?v='+a.join(","), function(){} ); }); } } }); </script> </head> <body> </body> </html>