Metainformationen zur Seite
  •  

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen Revision Vorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
computer:raspberrypi:projekte:matrix [2013/08/01 14:04]
gaubes [Raspberry Pi Programme]
computer:raspberrypi:projekte:matrix [2018/03/16 21:11] (aktuell)
Zeile 2: Zeile 2:
  
 Ziel ist es eine über den Arduino laufende LED-Matrix über die serielle Schnittstelle zum Raspberry Pi über Internet zu programmieren. Ziel ist es eine über den Arduino laufende LED-Matrix über die serielle Schnittstelle zum Raspberry Pi über Internet zu programmieren.
 +
 {{:​computer:​raspberrypi:​projekte:​dsc_0012.jpg?​320|}}{{:​computer:​raspberrypi:​projekte:​dsc_0007.jpg?​320|}} {{:​computer:​raspberrypi:​projekte:​dsc_0012.jpg?​320|}}{{:​computer:​raspberrypi:​projekte:​dsc_0007.jpg?​320|}}
 ==== Arduino Programm ==== ==== Arduino Programm ====
 Dazu wird das Arduino Programm ([[computer:​raspberrypi:​mit_arduino_koppeln|RaspberryPi mit Arduino koppeln]]) an ein weiteres Programm, welches eine Laufschrift anzeigen lässt angepasst: Dazu wird das Arduino Programm ([[computer:​raspberrypi:​mit_arduino_koppeln|RaspberryPi mit Arduino koppeln]]) an ein weiteres Programm, welches eine Laufschrift anzeigen lässt angepasst:
  
-<​code>​+<​code ​cpp>
 const int zeilenstart=2;​ // Pin ab dem die Zeilen anfangen const int zeilenstart=2;​ // Pin ab dem die Zeilen anfangen
 const int spaltenstart=10;​ // Pin ab dem die Spalten anfangen const int spaltenstart=10;​ // Pin ab dem die Spalten anfangen
Zeile 61: Zeile 62:
 } }
 </​code>​ </​code>​
-Da der Arduino über weniger als 64 Ausgänge verfügt, die Matrix allerdings 64 LEDs besitzt, kann durch Umwandlung in das Binärsystems/​Zweierpotenzen jede LED angesteuert werden.+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.
  
  
Zeile 70: Zeile 71:
  
 ==== Raspberry Pi Programme ==== ==== Raspberry Pi Programme ====
 +Zunächst sollte man den Raspberry Pi auf die serielle Kommunikation vorbereiten (siehe [[computer:​raspberrypi:​mit_arduino_koppeln#​raspberry_pi|RaspberryPi mit Arduino koppeln]]).
 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 "​[[computer:​raspberrypi:​mit_arduino_koppeln|RaspberryPi mit Arduino koppeln]]"​ ein wenig angepasst: ​ 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 "​[[computer:​raspberrypi:​mit_arduino_koppeln|RaspberryPi mit Arduino koppeln]]"​ ein wenig angepasst: ​
  
 === Parameterübergabe === === Parameterübergabe ===
-<​code>​+<​code ​python>
 import serial import serial
 import time import time
Zeile 101: Zeile 103:
 Über diese Internetseite kann man die benötigten Werte an das Python-Programm weiterreichen. Über diese Internetseite kann man die benötigten Werte an das Python-Programm weiterreichen.
  
-<​code>​+<​code ​php>
 <?php <?php
 $a = explode (",",​$_GET["​v"​]);​ $a = explode (",",​$_GET["​v"​]);​
Zeile 111: Zeile 113:
     passthru("/​usr/​bin/​python senden "​.implode("​ ",​$a));​     passthru("/​usr/​bin/​python senden "​.implode("​ ",​$a));​
 } else { } 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+    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">?​v=1,​2,​4,​8,​16,​32,​64,​128';​
 } }
 ?> ?>
Zeile 118: Zeile 120:
 === erweiterte Internetseite === === 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. ​ 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.[[computer:​raspberrypi:​projekte:​blinken|Blinken]]):​ +Davor muss man sich jedoch noch folgendes runterladen,​ um nicht über andere Server gehen zu müssen (Vgl. [[computer:​raspberrypi:​projekte:​blinken|Blinken]]):​ 
-<​code>​+<​code ​bash>
 wget http://​ajax.googleapis.com/​ajax/​libs/​jquery/​1/​jquery.min.js wget http://​ajax.googleapis.com/​ajax/​libs/​jquery/​1/​jquery.min.js
 </​code>​ </​code>​
  
-<​code> ​                                                           ​+<​code ​html>                                                            ​
 <​!DOCTYPE html> <​!DOCTYPE html>
 <​html>​ <​html>​
Zeile 166: Zeile 168:
 </​code>​ </​code>​
  
 +==== Netzwerkkontrolle ====
 +Wenn man den Raspberry Pi über Wlan steuert (siehe [[computer:​raspberrypi:​netzwerk|Netzwerk]] ), sollte man sicherstellen,​ dass der Pi nicht die Verbindung zum Netz verliert. Dazu gibt es ein Script (/​home/​pi/​checkping),​ welches prüft ob eine Verbindung vorliegt und gegebenenfalls das Wlan deaktiviert und wieder aktiviert:
 +
 +<code bash>
 +#!/bin/bash
 +IP=192.168.0.1
 +DEV=wlan0
 +
 +ping -q -W 5 -c 3 $IP >/​dev/​null
 +if [ ! $? -eq "​0"​ ]
 +then
 +  ifdown $DEV
 +  sleep 15
 +  ifup $DEV
 +fi
 +</​code>​
 +
 +Damit dieses Script alle 5 Minuten ausgeführt wird speichert man eine Datei mit folgendem Inhalt im Ordner **/​etc/​cron.d** :
 +<code bash>
 +*/5 *   * * *  root /​home/​pi/​checkping > /dev/null 2>&1
 +</​code>​
 +
 +==== Uhr ====
 +Um eine Uhr auf der Matrix anzeigen zu lassen, die sich für 20 Sekunden durch ein über Website programmierstes Muster überschreiben lässt benötigt man folgendes Script:
 +<code python>
 +import serial
 +import time
 +import sys
 +import os
 +import os.path
 +
 +delay = 0.01
 +comunicacion = serial.Serial('/​dev/​ttyAMA0',​ 9600)
 +comunicacion.close()
 +comunicacion.open()
 +
 +m=([0,​0,​0,​0,​0,​0,​0,​0])
 +h=([0,​0,​0,​0,​0,​0,​0,​0])
 +s=([0,​0,​0,​0,​0,​0,​0,​0])
 +
 +H = 0
 +M = 0
 +S = 0
 +
 +while True:
 +    try:
 +        timea = os.path.getmtime("/​tmp/​block"​)
 +    except:
 +        timea = time.time()
 +    if os.path.isfile("/​tmp/​block"​) and time.time()-timea>​20: ​
 +        H=time.localtime().tm_hour%12
 +        M=int(time.localtime().tm_min/​5)
 +        S=int(time.localtime().tm_sec/​2)
 +        while int(time.localtime().tm_sec/​2)==S:​
 +          time.sleep(delay)
 +
 +#​-----------------------------------------------------------------------  ​
 +#Minuten
 +
 +        m=[[0,​0,​0,​1,​1,​0,​0,​0],​
 +           ​[0,​0,​0,​0,​0,​1,​1,​0],​
 +           ​[0,​0,​0,​0,​0,​0,​0,​6],​
 +           ​[0,​0,​0,​0,​0,​0,​0,​24],​
 +           ​[0,​0,​0,​0,​0,​0,​0,​96],​
 +           ​[0,​0,​0,​0,​0,​128,​128,​0],​
 +           ​[0,​0,​0,​128,​128,​0,​0,​0],​
 +           ​[0,​128,​128,​0,​0,​0,​0,​0],​
 +           ​[96,​0,​0,​0,​0,​0,​0,​0],​
 +           ​[24,​0,​0,​0,​0,​0,​0,​0],​
 +           ​[6,​0,​0,​0,​0,​0,​0,​0],​
 +           ​[0,​1,​1,​0,​0,​0,​0,​0]]
 +#​-----------------------------------------------------------------------
 +#Stunden
 +        h=[[0,​0,​0,​2,​2,​0,​0,​0],​
 +           ​[0,​0,​0,​0,​2,​2,​0,​0],​
 +           ​[0,​0,​0,​0,​0,​2,​4,​0],​
 +           ​[0,​0,​0,​0,​0,​0,​24,​0],​
 +           ​[0,​0,​0,​0,​0,​0,​48,​0],​
 +           ​[0,​0,​0,​0,​0,​64,​32,​0],​
 +           ​[0,​0,​0,​64,​64,​0,​0,​0],​
 +           ​[0,​0,​64,​64,​0,​0,​0,​0],​
 +           ​[0,​32,​64,​0,​0,​0,​0,​0],​
 +           ​[0,​24,​0,​0,​0,​0,​0,​0],​
 +           ​[0,​12,​0,​0,​0,​0,​0,​0],​
 +           ​[0,​4,​2,​0,​0,​0,​0,​0]]
 +
 +#​----------------------------------------------------------------------- ​       ​
 +#Sekunden
 +        s=[[0,​0,​0,​1,​0,​0,​0,​0],​
 +           ​[0,​0,​0,​0,​1,​0,​0,​0],​
 +           ​[0,​0,​0,​0,​0,​1,​0,​0],​
 +           ​[0,​0,​0,​0,​0,​0,​1,​0],​
 +           ​[0,​0,​0,​0,​0,​0,​0,​1],​
 +           ​[0,​0,​0,​0,​0,​0,​0,​2],​
 +           ​[0,​0,​0,​0,​0,​0,​0,​4],​
 +           ​[0,​0,​0,​0,​0,​0,​0,​8],​
 +           ​[0,​0,​0,​0,​0,​0,​0,​16],​
 +           ​[0,​0,​0,​0,​0,​0,​0,​32],​
 +           ​[0,​0,​0,​0,​0,​0,​0,​64],​
 +           ​[0,​0,​0,​0,​0,​0,​0,​128],​
 +           ​[0,​0,​0,​0,​0,​0,​0,​128],​
 +           ​[0,​0,​0,​0,​0,​0,​128,​0],​
 +           ​[0,​0,​0,​0,​0,​128,​0,​0],​
 +           ​[0,​0,​0,​0,​128,​0,​0,​0],​
 +           ​[0,​0,​0,​128,​0,​0,​0,​0],​
 +           ​[0,​0,​128,​0,​0,​0,​0,​0],​
 +           ​[0,​128,​0,​0,​0,​0,​0,​0],​
 +           ​[128,​0,​0,​0,​0,​0,​0,​0],​
 +           ​[64,​0,​0,​0,​0,​0,​0,​0],​
 +           ​[32,​0,​0,​0,​0,​0,​0,​0],​
 +           ​[16,​0,​0,​0,​0,​0,​0,​0],​
 +           ​[8,​0,​0,​0,​0,​0,​0,​0],​
 +           ​[4,​0,​0,​0,​0,​0,​0,​0],​
 +           ​[2,​0,​0,​0,​0,​0,​0,​0],​
 +           ​[1,​0,​0,​0,​0,​0,​0,​0],​
 +           ​[1,​0,​0,​0,​0,​0,​0,​0],​
 +           ​[0,​1,​0,​0,​0,​0,​0,​0],​
 +           ​[0,​0,​1,​0,​0,​0,​0,​0]]
 +#​----------------------------------------------------------------------- ​       ​
 +
 +
 +        for a in [0,0,0]:
 +                comunicacion.write(chr( 0 ))
 +                time.sleep(delay)
 +
 +        for i in range(0,8):
 +                t_i = m[M][i] | h[H][i] | s[S][i]
 +                print t_i
 +                comunicacion.write(chr( int(t_i) ))
 +                time.sleep(delay)
 +
 +    else:
 +        time.sleep(1)
 +
 +</​code>​
 +Damit das Programm uhr.py automatisch beim Start des Raspberry Pis im Hintergrund mitgestartet wird, fügt man folgende Zeilen in **/​etc/​rc.local** hinzu:
 +<code bash>
 +
 +#!/bin/sh -e
 +#
 +# rc.local
 +#
 +# This script is executed at the end of each multiuser runlevel.
 +# Make sure that the script will "exit 0" on success or any other
 +# value on error.
 +#
 +# In order to enable or disable this script just change the execution
 +# bits.
 +#
 +# By default this script does nothing.
 +
 +python /​home/​pi/​uhr.py &
 +
 +exit 0
 +
 +</​code>​