Kategorien
Raspberry Pi

Raspberry Pi – Eigenbau Pegelwandler für serielle Kommunikation RS232 3,3Volt zu 5Volt TTL für AVR Mikrocontroller

Da mir der unter Raspberry Pi – Serielle Schnittstelle (RS232) nutzen vorgestellte Aufbau zu sperrig war, habe ich ein wenig gesucht, ob sich nicht ein Pegelwandler zusammen löten lässt, der direkt zwischen GPIO der Pi und RX / TX Pins des Mikrocontrollers hängt.

Unter http://www.elektronik-kompendium.de/sites/praxis/bausatz_pegelwandler-mit-transistoren.htm fand ich eine brauchbare Schaltung mit Transistoren und Widerständen, die ich so ähnlich in der Werkzeugkiste hatte.

Die folgenden Bilder zeigen meinen Schaltplan und den Testaufbau.

Der erste Test funktionierte einwandfrei sowohl in die Richtung Pi als auch in Richtung AVR Mikrocontroller.

Eigenbau_Pegelwandler_2Eigenbau_PegelwandlerSchaltplan_Pegelwandler_Raspberry_Pi_TTLEigenbau_Pegelwandler_3

Das dritte Bild zeigt den verwendeten Schaltplan und das vierte Bild den Aufbau auf Lochrasterplatine.

Jetzt kann ich mein Testboard und die Pi über normale Jumper Kabel verbinden, ohne diverse Zusatzplatinen herum hängen zu haben.

Kategorien
Programmierung

Eclipse – Programmierumgebung dunkel machen

Eclipse Programmierumgebung dunkel machen

Allgemeines

Meine Anwendungen laufen unter Ubuntu (Stand 2/2012 Version 11.10) mit dem Fenstermanager Gnome 3 und dem Ubuntu Standard GTK+ Thema Ambiance.

Starte ich in diesem Umfeld eine Eclipse Entwicklungsumgebung, sieht das in etwa so aus, wie im ersten Bild unterhalb dargestellt. Die Farben sind wohl aufeinander abgestimmt, die Übersichtlichkeit ist gewahrt, nur ist es recht hell.
Im folgenden Teil dieser Seite möchte ich nun meinen Weg beschreiben, die Umgebung dunkler zu gestalten. Wie in Bild 2 und 3 zu sehen, ist dies über einen Zwischenschritt erfolgt.

go to top

Schritt 1: Editorbereich abdunkeln

Zur Modifikation des Editor Look and Feels / Syntax Hiliting, gibt es viele Blogs im Netz, wo genau erläutert wird, wie vorzugehen ist.
Ein Video, wie das herunter geladene Thema integriert werden kann, ist unter www.eclipsecolorthemes.org how-to-use zu finden. Und Themen zum runter laden gibt es dort auch genügend.
Ich habe mich für dieses www.eclipsecolorthemes.org… entschieden.
Wem die Auswahl nicht reicht, der kann auf der Seite sein persönliches Farbschema zusammen hacken. :-)

Schritt 1: Extrakt

  1. Ein schönes Theme aussuchen, z.B. www.eclipsecolorthemes.org…
  2. Die *.epf Version downloaden
  3. In die Eclipse gehen
    1. File -> Import
    2. General -> Preferences auswählen
    3. Quelle zur Theme Datei, die runtergeladen wurde angeben
    4. Finish
go to top

Schritt 2: Eclipse Frame anpassen

globaler Ansatz

Die einfachste Methode alles was jetzt noch hell ist zu modifizieren, ist ein anderes GTK+ Theme für Gnome zu verwenden.
Das geht relativ einfach mit dem Tweak Tool.
Aufgerufen werden kann es mit |Windows Taste| und dann ‘tweak’ eingeben (Siehe erstes Bild weiter unten).
Dort unter Thema ein anderes dunkleres GTK+ Thema auswählen.
Sollte tweak nicht installiert sein, lässt sich das schnell an der Konsole erledigen.

Linux Terminal
  1. sudo apt-get install gnome-tweak-tool

Ich habe mich für ein dunkles Thema entschieden und wie die folgenden Bilder zeigen, sieht das was Eclipse angeht recht gut aus.
Problematisch ist nur, dass alle Fenster jetzt finster sind, auch Webbrowser, Email Programm u.s.w., was etwas über das Ziel hinaus geschossen ist.

individueller Ansatz

Nach ein wenig Recherche im Netz, bin ich bei …gtk-application-specific-skin-possible… auf etwas brauchbares gestossen.
Es ist also möglich mittels Environmentvariable ein Thema anzugeben. Wie im folgenden zu sehen, ist die besagte Variable bei mir nicht belegt.

Linux Terminal
  1. ~|$ echo GTK2_RC_FILES
  2. GTK2_RC_FILES

Der logische Schluß war ein winziges Shell Script zu schreiben, dass

  • den Pfad für die gtkrc in die Environment Variable GTK2_RC_FILES stellt
  • Eclipse startet
  • die Environment Variable GTK2_RC_FILES wieder löscht,

was dann so aussieht.

Startscript Eclipse
  1. #!/bin/sh
  2. export GTK2_RC_FILES=$HOME/.gtkrc-eclipse
  3. /opt/eclipse/eclipse
  4. env --unset=GTK2_RC_FILES

Ich habe mich dazu entschieden kein vordefiniertes Thema zu verwenden, sondern stattdessen das Ambiance Thema farblich zu modifizieren.
Einen Hinweis, wie das gemacht wird, ist unter …nice-looking-eclipse-under-linux… zu finden.
In dem Beitrag geht es zwar vordergündig um eine unschöne Anordnung der Elemente der Eclipse GUI, aber es half mir auf die Sprünge und die Anordnungsthematik habe ich auch gleich mit übernommen :-).

.gtkrc-eclipse
  1. gtk-color-scheme = "base_color:#252525\nfg_color:#f0f0f0\ntooltip_fg_color:#252525\nselected_bg_color:#2d8226\nselected_fg_color:#252525\ntext_color:#dadada\nbg_color:#2a270f\ntooltip_bg_color:#42bd37\nlink_color:#47710a"
  2. 
    
  3. style "gtkcompact" {
  4. font_name="Sans 11"
  5. GtkButton::default_border={0,0,0,0}
  6. GtkButton::default_outside_border={0,0,0,0}
  7. GtkButtonBox::child_min_width=0
  8. GtkButtonBox::child_min_heigth=0
  9. GtkButtonBox::child_internal_pad_x=0
  10. GtkButtonBox::child_internal_pad_y=0
  11. GtkMenu::vertical-padding=1
  12. GtkMenuBar::internal_padding=0
  13. GtkMenuItem::horizontal_padding=4
  14. GtkToolbar::internal-padding=0
  15. GtkToolbar::space-size=0
  16. GtkOptionMenu::indicator_size=0
  17. GtkOptionMenu::indicator_spacing=0
  18. GtkPaned::handle_size=4
  19. GtkRange::trough_border=0
  20. GtkRange::stepper_spacing=0
  21. GtkScale::value_spacing=0
  22. GtkScrolledWindow::scrollbar_spacing=0
  23. GtkExpander::expander_size=10
  24. GtkExpander::expander_spacing=0
  25. GtkTreeView::vertical-separator=0
  26. GtkTreeView::horizontal-separator=0
  27. GtkTreeView::expander-size=8
  28. GtkTreeView::fixed-height-mode=TRUE
  29. GtkWidget::focus_padding=0
  30. 	####################
  31. 	# Color Definitions
  32. 	####################
  33. 	bg[NORMAL]        = @bg_color
  34. 	bg[PRELIGHT]      = shade (1.02, @bg_color)
  35. 	bg[SELECTED]      = @selected_bg_color
  36. 	bg[INSENSITIVE]   = shade (0.95, @bg_color)
  37. 	bg[ACTIVE]        = shade (0.9, @bg_color)
  38. 
    
  39. 	fg[NORMAL]        = @fg_color
  40. 	fg[PRELIGHT]      = @fg_color
  41. 	fg[SELECTED]      = @selected_fg_color
  42. 	fg[INSENSITIVE]   = darker (@bg_color)
  43. 	fg[ACTIVE]        = @fg_color
  44. 
    
  45. 	text[NORMAL]      = @text_color
  46. 	text[PRELIGHT]    = @text_color
  47. 	text[SELECTED]    = @selected_fg_color
  48. 	text[INSENSITIVE] = shade (0.8, @bg_color)
  49. 	text[ACTIVE]      = darker (@text_color)
  50. 
    
  51. 	base[NORMAL]      = @base_color
  52. 	base[PRELIGHT]    = shade (0.98, @bg_color)
  53. 	base[SELECTED]    = @selected_bg_color
  54. 	base[INSENSITIVE] = shade (0.97, @bg_color)
  55. 	base[ACTIVE]      = shade (0.94, @bg_color)
  56. }
  57. class "GtkWidget" style "gtkcompact"
  58. 
    
  59. style "gtkcompactextra" {
  60. xthickness=0
  61. ythickness=0
  62. }
  63. class "GtkButton" style "gtkcompactextra"
  64. class "GtkToolbar" style "gtkcompactextra"
  65. class "GtkPaned" style "gtkcompactextra"

Zeile 3 – 29 bewirken die optimalere Anordnung.
In den Zeilen 30 bis 55 werden die Farben für Vorder- und Hintergründe gesetzt.
Die Form habe ich aus dem gtkrc des Ambiance Designs kopiert, ebenso wie die Zeile 1, die die Farbwerte definiert.
In der folgenden Darstellung sind Diese zu sehen.

base_color #252525 fg_color #f0f0f0 tooltip_fg_color #252525
selected_bg_color #2d8226 selected_fg_color #252525 text_color #dadada
bg_color #2a270f tooltip_bg_color #42bd37 link_color

Mehr ist es nicht. Bei mir liegen das Shell Startscript und die modifizierte gtkrc-eclipse in meinem Dokumenten Ordner.
Um die dunkle Eclipse nicht permanent via Terminal starten zu müssen, habe ich das Script im Gnome Hauptmenü verdrahtet und auch noch ein entsprechendes Icon erstellt.
Siehe folgende Bilder;

Kategorien
Raspberry Pi

Raspberry Pi – Serielle Schnittstelle (RS232) nutzen

Die Raspberry Pi ist mit vielen Schnittstellen ausgestattet.
Mit dem USB Port lassen sich die Möglichkeiten diesbezüglich mehr als potenzieren.
Um mit meinen AVR Mikrocontrollern zu kommunizieren ist am besten eine serielle Schnittstelle geeignet.

Natürlich hat die Raspberry Pi Eine, aber leider nur als Pins auf der GPIO Steckerleiste.
Die benötigten Pins könnten theoretisch direkt mit dem Mikrocontroller z.B. ATMega8 verbunden werden.
Das würde aber voraussetzen, dass der Mikrocontroller mit 3,3 Volt arbeitet.
Mein Pollin Evaluationsboard arbeitet aber mit 5 Volt, bringt aber eine fertige RS232 Schnittstelle zur Kommunikation mit PC’s oder sonstigen Gerätschaften mit.
Am einfachsten wäre es, die Pi hätte ebenso eine RS232 Schnittstelle.
Beim Googlen habe ich dann die Seite Serial Port Add On gefunden.
Das dort beschriebene Serial Port to TTL Digital Converter Module, habe ich mir bei Ebay gekauft.

GPIO Header Pins
RaspberryPI_GPIO_serielle_Schnittstelle
2 4 6 8 10 12 14 16 18 20 22 24 26
1 3 5 7 9 11 13 15 17 19 21 23 25
1= 3.3V, 9= GND, 8= TX, 10= RX

Die Jumper Kabel zum Anschluss an die Raspberry Pi wurden mitgeliefert.
Ich habe das Modul, wie im Bild dargestellt mit der Pi verbunden.

Um die serielle Schnittstelle ans Laufen zu bekommen müssen noch die /etc/inittab und die /boot/cmdline.txt angepasst werden.

/etc/inittab

  • Auskommentieren der Zeile ‘T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100’
#Spawn a getty on Raspberry Pi serial line
#T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100

/boot/cmdline.txt

  • Löschen von: dwc_otg.lpm_enable=0 console=ttyAMA0,115200 kgdboc=ttyAMA0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait
dwc_otg.lpm_enable=0 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait

Bilder meiner PI inklusive ‘serieller Schnittstelle’

RaspberryPI_mit_serieller_Schnittstelle_VS RaspberryPI_GPIO_serielle_Schnittstelle1_VS RaspberryPI_GPIO_serielle_Schnittstelle2_VS RaspberryPI_GPIO_serielle_Schnittstelle3_VS RaspberryPI_GPIO_serielle_Schnittstelle4_VS

Video, zur Demonstration

Das Video kommt bereits bei meinem ‘Hello World Beispiel’ im ATMega8 Bereich meiner Webseite zum Einsatz.
Ich habe dafür ein kleines Perl Script geschrieben.
Sicherlich wäre es auch mit Programmen wie minicom gegangen, aber da hätte ich mich auch erst mal wieder einarbeiten müssen.
Das Script ging schneller und ist am Ende des Tages flexibler.

Kategorien
ATMega8

ATMega8 – Registerinhalte auf dem Mikrocontroller über serielle Schnittstelle steuern

Pollin_Board_klein
Wie im Beispiel Hello World über serielle Schnittstelle senden und im Beispiel LED’s des Pollin Evaluationboards über die serielle Schnittstelle steuern dargestellt, ist es recht einfach möglich Buchstaben oder Bytes zu einem PC zu übertragen und auch anders herum vom PC aus Schaltzustände zu verändern.
Die neue Herausforderung ist es nun Registerinhalte via serieller Schnittstelle zu füllen und Diese wieder auszulesen.

Gedacht ist die Übung als Vorbereitung für eine interne Systemuhr auf dem ATMega8, die von einem PC oder z.B. auch der Raspberry Pi gestellt und abgelesen werden kann.

PollinBoard_ATMega8_Registerinhalte_per_UART_steuern_und_ausgeben_Ablaufplan_VSWie im Ablaufplan (Bild links) dargestellt, habe ich das Programm so strukturiert, dass

  • im Hauptprogramm die Variablen initialisiert werden und der Interrupt sobald ein Byte über RX/UART empfangen wird, aktiviert ist
  • Das Unterprogramm IncommingByte entscheidet, ob es sich um ein Aktives, oder Neues Unterprogramm handelt und ruft ein weiteres Unterprogramm FunctionCall auf, was an das aktive oder gewählte Unterprogramm weiterleitet.
  • Das Unterprogramm StelleUhr, wird durch das Senden eines Bytes mit dem Inhalt 1 aufgerufen und erwartet das danach 3 weitere Bytes als Inhalt für die Register Stunde, Minute und Sekunde via RX/UART übergeben werden. Diese werden in den Registern gespeichert.
  • Das Unterprogramm Sende Uhrzeit, wird mit einem Byte mit Inhalt 2 aufgerufen und sendet 3 Byte mit den Inhalten Stunde, Minute und Sekunde zurück an den PC.

Der hier abgebildete Assemblercode ist mit vielen Kommentaren versehen.

Quellcode des Assemblerprogramms:

; avrdude -p m8 -c stk500v2 -P /dev/ttyACM0 -U flash:w:Registerinhalte_via_UART_steuern_und_ausgeben.hex
; 13.9.2013 Das Programm soll Registerinhalte per serielle Datenübertragung manipulieren können und diese auch wieder ausgeben
.NOLIST
;.INCLUDE "/home/henry/Dokumente/Mikrocontroller/AVR-Assembler/AVR_Definitionsfiles/m8def.inc"
.INCLUDE "m8def.inc"
.LIST
;
.def Sekunde                = R2
.def Minute                 = R3
.def Stunde                 = R4
;--------------------------------
.def temp                   = R16               ; Register 16 der Variable temp zuweisen 
.def ByteNummer             = R17               ; Enthält die Nummer des aktuell übertragenen Bytes innerhalb eine Unterprogramms
.def aktivesUnterprogramm   = R19               ; Enthält die numerische ID des aktuell aktiven Unterprogamms
.def EmpfRXByte             = R20               ; Enthält das zuletzt via. UART empfangene Byte 
 
.equ F_CPU = 16000000                           ; Systemtakt in Hz
.equ BAUD  = 9600                               ; Baudrate
 
; Berechnungen
.equ UBRR_VAL   = ((F_CPU+BAUD*8)/(BAUD*16)-1)  ; clever runden
.equ BAUD_REAL  = (F_CPU/(16*(UBRR_VAL+1)))     ; Reale Baudrate
.equ BAUD_ERROR = ((BAUD_REAL*1000)/BAUD-1000)  ; Fehler in Promille
 
.if ((BAUD_ERROR>10) || (BAUD_ERROR<-10))       ; max. +/-10 Promille Fehler
  .error "Systematischer Fehler der Baudrate grösser 1 Prozent und damit zu hoch!"
.endif
 
; Startvektoren 
.org 0x00
    rjmp main
.org URXCaddr                                   ; Interruptvektor für UART-Empfang
    rjmp IncommingByte
 
; --------------------------------Hauptprogramm--------------------------------------
main:
 
    ; Stackpointer initialisieren
    ldi     temp, HIGH(RAMEND)
    out     SPH, temp
    ldi     temp, LOW(RAMEND)
    out     SPL, temp
 
    ; Baudrate einstellen
    ldi     temp, HIGH(UBRR_VAL)
    out     UBRRH, temp
    ldi     temp, LOW(UBRR_VAL)
    out     UBRRL, temp
 
    ; Frame-Format: 8 Bit
    ldi     temp, (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0)     out     UCSRC, temp     sbi     UCSRB, RXCIE                        ; Interrupt bei Empfang     sbi     UCSRB, RXEN                         ; RX (Empfang) aktivieren          sei                                         ; Interrupts global aktivieren loop:     rjmp    loop                                ; Endlosschleife / idle mode ; ---------------------------ENDE Hauptprogramm-------------------------------------- ; ---------------------------IncommingByte------------------------------------------- ; Interruptroutine: wird ausgeführt sobald ein Byte über das UART empfangen wurde IncommingByte:     in      EmpfRXByte, UDR                     ; empfangenes Byte lesen,                                                 ; dadurch wird auch der Interrupt gelöscht     cpi     aktivesUnterprogramm, 1             ; vergleich aktivesUnterprogramm mit 1     brge    UPAufruf                            ; ist aktivesUnterprogramm > 0, springe zu UPAufruf
    mov     aktivesUnterprogramm, EmpfRXByte    ; kopiere EmpfRXByte in aktivesUnterprogramm
    clr     ByteNummer                          ; setze ByteNummer aud 0
 
UPAufruf:
    rcall   FunctionCall                        ; rufe Unterprogramm FunctionCall auf
EndIncommingByte:
    reti                                        ; Interrupt beenden
; ----------------------Ende-IncommingByte-------------------------------------------
 
; ---------------------------FunctionCall--------------------------------------------
; Abfrage aktivesUnterprogramm und Aufruf der entsprechenden Unterprogramme
FunctionCall:
    cpi     aktivesUnterprogramm, 1
    breq    Byte1                               ; Wenn eine 1 übertragen wurde zu Byte1 springen 
    cpi     aktivesUnterprogramm, 2
    breq    Byte2                               ; Wenn eine 2 übertragen wurde zu Byte2 springen 
    rjmp    EndFunctionCall                     ; zum Unterprogramm - Ende (Es wurde kein Wert der einem gültigem Unterprogarmm entspricht übertragen.)
 
Byte1:
    rcall   StelleUhr                           ; StelleUhr aufrufen
    rjmp    EndFunctionCall                     ; zum Unterprogramm - Ende
Byte2:
    rcall   SendeUhrzeit                        ; SendeUhrzeit aufrufen
    rjmp    EndFunctionCall                     ; zum Unterprogramm - Ende
EndFunctionCall:
    ret                                         ; Ende - zurück springen
; ----------------------Ende-FunctionCall--------------------------------------------
 
; ---------------------------StelleUhr-----------------------------------------------
StelleUhr:
    cpi     ByteNummer, 1                       ; vergleich ByteNummer mit 1
    breq    StelleSekunde                       ; ist ByteNummer = 1, springe zu StelleSekunde
 
    cpi     ByteNummer, 2                       ; vergleich ByteNummer mit 2
    breq    StelleMinute                        ; ist ByteNummer = 2, springe zu StelleMinute
 
    cpi     ByteNummer, 3                       ; vergleich ByteNummer mit 3
    breq    StelleStunde                        ; ist ByteNummer = 3, springe zu StelleStunde
 
    rjmp    ErhoeheByteNummer                   ; springe zu ErhoeheByteNummer
 
StelleSekunde:
    mov     Sekunde, EmpfRXByte                 ; Kopiere EmpfRXByte in Sekunde
    rjmp    ErhoeheByteNummer                   ; spinge zu ErhoeheByteNummer
 
StelleMinute:
    mov     Minute, EmpfRXByte                  ; Kopiere EmpfRXByte in Minute
    rjmp    ErhoeheByteNummer                   ; spinge zu ErhoeheByteNummer
 
StelleStunde:
    mov     Stunde, EmpfRXByte                  ; Kopiere EmpfRXByte in Stunde
    clr     aktivesUnterprogramm                ; setze aktivesUnterprogramm auf Null, wir sind fertig mit Uhr stellen :-)
    rjmp    EndStelleUhr                        ; spinge zu EndStelleUhr
 
ErhoeheByteNummer:
    inc     ByteNummer                          ; erhöhe ByteNummer um 1
EndStelleUhr:
    ret                                         ; Ende - zurück springen
; ----------------------Ende-StelleUhr-----------------------------------------------
 
; ---------------------------SendeUhrzeit--------------------------------------------
SendeUhrzeit:
    cbi     UCSRB, RXEN                         ; RX (Empfang) deaktivieren
    sbi     UCSRB, TXEN                         ; TX (Senden) aktivieren
 
Sekunde_wait:
    sbis    UCSRA,UDRE                          ; Warten bis UDR für das nächste Byte bereit ist
    rjmp    Sekunde_wait                        ; Springe zurück zu Sekunde_wait, solange UDR noch nicht bereit ist
    out     UDR, Sekunde                        ; sende das Byte Sekunde via UART
 
Minute_wait:
    sbis    UCSRA,UDRE                          ; Warten bis UDR für das nächste Byte bereit ist
    rjmp    Minute_wait                         ; Springe zurück zu Minute_wait, solange UDR noch nicht bereit ist
    out     UDR, Minute                         ; sende das Byte Minute via UART
 
Stunde_wait:
    sbis    UCSRA,UDRE                          ; Warten bis UDR für das nächste Byte bereit ist
    rjmp    Stunde_wait                         ; Springe zurück zu Stunde_wait, solange UDR noch nicht bereit ist
    out     UDR, Stunde                         ; sebnde das Byte Stunde via UART
 
    cbi     UCSRB, TXEN                         ; TX (Senden) deaktivieren
    sbi     UCSRB, RXEN                         ; RX (Empfang) aktivieren
    clr     aktivesUnterprogramm                ; setze aktivesUnterprogramm auf Null, wir sind fertig mit Uhrzeit ausgeben :-)
EndSendeUhrzeit:
    ret                                         ; Ende - zurück springen
; ----------------------Ende-SendeUhrzeit--------------------------------------------

 

Video, zur Demonstration

 

Kategorien
ATMega8

ATMega8 – LED’s des Pollin Evaluationboards über die serielle Schnittstelle steuern

Pollin_Board_kleinRS232_VS
Das Prinzip der seriellen Schnittstelle (RS232), wie Sie früher an nahezu jedem PC zu finden war ist nach wie vor aktuell.
Für den PC sind RS232 zu USB Adapter verfügbar und auf der Mikrocontroller – Seite lässt sich z.B. ein Bluetooth zu Serial Adapter einsetzen, womit ganz auf die Kabel verzichtet werden kann und die Kommunikation auch jedes Smartphone übernehmen kann.

In diesem Beispiel soll ein Byte vom PC an das Evaluationboard gesendet werden.
Sobald Dieses über UART empfangen wird, beginnt die Prüfung des übertragenen Bytes.
Ist der Wert = 1, soll die LED1 eingeschaltet werden, bei 2 soll die LED1 ausgeschaltet werden.
Bei 3 soll die LED2 eingeschaltet werden und bei 4 soll die LED2 ausgeschaltet werden.
Werden andere Inhalte empfangen, sollen keine Aktionen ausgelöst werden.
Um Bytes über die serielle Schnittstelle zu übertragen, gibt es mehrere Möglichkeiten.
Unter Linux nutze ich Cutecom, unter Windows geht Putty.
Es gibt aber auch noch viele andere Programme. Auch ein entsprechendes Script ist für diesen Zweck schnell geschrieben.

PollinBoard_ATMega8_LEDS_per_UART_steuern_Ablaufplan_VSWie im Ablaufplan Links zu erkennen, ist dieses Beispiel ein wenig komplexer als die vorherigen beiden Posts zum Evaluationsboard (LED 1 und 2 über Taster T1 und T2 schalten und Hello World über serielle Schnittstelle senden).
Dennoch lässt sich der Code sehr gut in Assembler abbilden.
Kein Grund hier C einsetzen zu müssen oder gar ein Embedded Linux System o.ä.

Der hier abgebildete Assemblercode ist mit vielen Kommentaren versehen.

Quellcode des Assemblerprogramms:

; avrdude -p m8 -c stk500v2 -P /dev/ttyACM0 -U flash:w:LEDs_via_UART_schalten.hex
; 31.8.2013 Das Programm soll über UART empfangene Bytes auswerten und wenn ein Zahlenwert 
; zwischen 1 und 4 empfangen wurde die LED1/2 folgendermßen schalten
; 1 - LED1 an
; 2 - LED1 aus
; 3 - LED2 an
; 4 - LED2 aus
; Der UART Receive Teil des Programms ist in Teilen aus 
; http://www.mikrocontroller.net/articles/AVR-Tutorial:_UART#Empfangen_von_Zeichen_per_Interrupt
; übernommen. Dort gibt es noch viel weitere Infos und Tipps
.NOLIST
;.INCLUDE "/home/henry/Dokumente/Mikrocontroller/AVR-Assembler/AVR_Definitionsfiles/m8def.inc"
.INCLUDE "m8def.inc"
.LIST
;
.def temp   = R16                               ; Register 16 der Variable temp zuweisen 
.def RXByte = R17                               ; Register 17 der Variable RXByte zuweisen
 
.equ F_CPU = 16000000                           ; Systemtakt in Hz
.equ BAUD  = 9600                               ; Baudrate
 
.equ LED1       = PD5                           ; Pin LED1
.equ LED2       = PD6                           ; Pin LED2
 
 
; Berechnungen
.equ UBRR_VAL   = ((F_CPU+BAUD*8)/(BAUD*16)-1)  ; clever runden
.equ BAUD_REAL  = (F_CPU/(16*(UBRR_VAL+1)))     ; Reale Baudrate
.equ BAUD_ERROR = ((BAUD_REAL*1000)/BAUD-1000)  ; Fehler in Promille
 
.if ((BAUD_ERROR>10) || (BAUD_ERROR<-10))       ; max. +/-10 Promille Fehler
  .error "Systematischer Fehler der Baudrate grösser 1 Prozent und damit zu hoch!"
.endif
 
; Startvektoren 
.org 0x00
    rjmp main
.org URXCaddr                                   ; Interruptvektor für UART-Empfang
    rjmp IncommingByte
 
; --------------------------------Hauptprogramm--------------------------------------
main:
 
    ; Stackpointer initialisieren
    ldi     temp, HIGH(RAMEND)
    out     SPH, temp
    ldi     temp, LOW(RAMEND)
    out     SPL, temp
 
    ; Baudrate einstellen
    ldi     temp, HIGH(UBRR_VAL)
    out     UBRRH, temp
    ldi     temp, LOW(UBRR_VAL)
    out     UBRRL, temp
 
    ldi     temp, (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0)
    out     UCSRC, temp
 
    sbi     UCSRB, RXCIE                    ; Interrupt bei Empfang
    sbi     UCSRB, RXEN                     ; RX (Empfang) aktivieren
 
    ; Port D, LED Pins auf Ausgang und Taster Pins auf Eingang schalten
    ldi     temp, (1<<LED1) | (1<<LED2)                         
    out     DDRD, temp                      ; LED1/2 Pollin Evaluationsboard ,, PD5/6 auf Ausgang schalten  
 
    sei                                     ; Interrupts global aktivieren    
 
loop:
    rjmp    loop                            ; Endlosschleife / idle mode
 
; ---------------------------ENDE Hauptprogramm--------------------------------------
 
; ---------------------------IncommingByte-------------------------------------------
; Interruptroutine: wird ausgeführt sobald ein Byte über das UART empfangen wurde
IncommingByte:
    in      RXByte, UDR                     ; empfangenes Byte lesen,
                                            ; dadurch wird auch der Interrupt gelöscht
; Abfrage des Byte Inhaltes und aufruf der entsprechenden Unterprogramme zum schalten der LED's
    cpi     RXByte, 1
    breq    Byte1                           ; Wenn eine 1 übertragen wurde zu Byte1 springen 
    cpi     RXByte, 2
    breq    Byte2                           ; Wenn eine 2 übertragen wurde zu Byte2 springen 
    cpi     RXByte, 3
    breq    Byte3                           ; Wenn eine 3 übertragen wurde zu Byte3 springen 
    cpi     RXByte, 4
    breq    Byte4                           ; Wenn eine 4 übertragen wurde zu Byte4 springen 
    rjmp    EndIncommingByte                ; zum Unterprogramm - Ende (Es wurde kein Wert zwischen 1 und 4 übertragen.)
 
Byte1:
    rcall   LED1Ein                         ; LED1Ein aufrufen
    rjmp    EndIncommingByte                ; zum Unterprogramm - Ende
Byte2:
    rcall   LED1Aus                         ; LED1Aus aufrufen
    rjmp    EndIncommingByte                ; zum Unterprogramm - Ende
Byte3:
    rcall   LED2Ein                         ; LED2Ein aufrufen
    rjmp    EndIncommingByte                ; zum Unterprogramm - Ende
Byte4:
    rcall   LED2Aus                         ; LED2Aus aufrufen
    rjmp    EndIncommingByte                ; zum Unterprogramm - Ende
 
EndIncommingByte:
    reti                                    ; Interrupt beenden
; ----------------------Ende-IncommingByte-------------------------------------------
; ----------------------Die 4 Unterprogramme zum LED's schalten----------------------
LED1Ein:
    sbi     PORTD, LED1                     ; Setze das LED1 Bit in PORTD
    ret
 
LED1Aus:
    cbi     PORTD, LED1                     ; Lösche das LED1 Bit in PORTD
    ret
 
LED2Ein:
    sbi     PORTD, LED2                     ; Setze das LED2 Bit in PORTD
    ret
 
LED2Aus:
    cbi     PORTD, LED2                     ; Lösche das LED2 Bit in PORTD
    ret
; -----------------Ende-Die 4 Unterprogramme zum LED's schalten----------------------

 

Video, zur Demonstration

 

Kategorien
ATMega8

ATMega8 – Hello World über serielle Schnittstelle senden


Pollin_Board_kleinDas Pollin Evaluations – Board ist mit einer seriellen RS232 Schnittstelle ausgestattet, was einen einfachen zum Datenaustausch mit einem PC ermöglicht.

RS232_VS
PollinBoard_ATMega8_HelloWorld_per_UART_Beispiel_VS
PollinBoard_ATMega8_HelloWorld_per_UART_Beispiel_Ablaufplan_VS

Die folgenden Ausführungen bauen auf das Beispiel ‘mit Taster T1/2 die LED1/2 ansteuern‘ auf.

Ziel ist es ein ‘Hello World’ an die serielle Schnittstelle zu senden, sobald der Taster T1 gedrückt wurde.
Die im Assemblerprogramm anzusteuernden Ports und Pins sind aus der Grafik auf der rechten Seite ersichtlich.
Auch dieses Beispiel habe ich so ähnlich aus dem AVR Tutorial von Mikrocontroller.net entnommen und auf die Gegebenheiten des Pollin Boards angepasst.

Der hier abgebildete Assemblercode ist mit vielen Kommentaren versehen.

Quellcode des Assemblerprogramms:

; avrdude -p m8 -c stk500v2 -P /dev/ttyACM0 -U flash:w:HelloWorld_via_UART.hex
; 5.8.2013 Das Programm soll die Worte 'Hello World' via. UART ausgeben, sobald der Taster1 gedrückt wurde
; Das Programm ist zum grossen Teil aus 
; http://www.mikrocontroller.net/articles/AVR-Tutorial:_UART#Senden_von_Zeichen
; übernommen. Dort gibt es noch viel weitere Infos und Tipps
.NOLIST
;.INCLUDE "/home/henry/Dokumente/Mikrocontroller/AVR-Assembler/AVR_Definitionsfiles/m8def.inc"
.INCLUDE "m8def.inc"
.LIST
;
.def temp       = R16
 
.equ F_CPU      = 16000000                      ; Systemtakt in Hz
.equ BAUD       = 9600	                        ; Baudrate
 
.equ Taster1 	= PD2
 
; Berechnungen
.equ UBRR_VAL   = ((F_CPU+BAUD*8)/(BAUD*16)-1)  ; clever runden
.equ BAUD_REAL  = (F_CPU/(16*(UBRR_VAL+1)))     ; Reale Baudrate
.equ BAUD_ERROR = ((BAUD_REAL*1000)/BAUD-1000)  ; Fehler in Promille
 
.if ((BAUD_ERROR>10) || (BAUD_ERROR<-10))       ; max. +/-10 Promille Fehler
  .error "Systematischer Fehler der Baudrate grösser 1 Prozent und damit zu hoch!"
.endif
 
.org 0x00
        rjmp main
 
; Hauptprogramm
 
main:
 
; Stackpointer initialisieren
    ldi     temp, HIGH(RAMEND)
    out     SPH, temp
    ldi     temp, LOW(RAMEND)
    out     SPL, temp
 
; Baudrate einstellen
    ldi     temp, HIGH(UBRR_VAL)
    out     UBRRH, temp
    ldi     temp, LOW(UBRR_VAL)
    out     UBRRL, temp
 
; Frame-Format: 8 Bit
    ldi     temp, (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0) 
    out     UCSRC, temp 
    sbi     UCSRB,TXEN                  	; TX aktivieren 
    sei                                         ; Interrupts global aktivieren Tastenabfrage: 
    sbic	PIND, Taster1 
    rcall 	SendHelloWorld			; Wenn Taster1 auf High (gedrückt), dann rufe SendHelloWorld auf 
    rjmp 	Tastenabfrage                   ; Endlosschleife 
SendHelloWorld:
T1entprellen:
    sbic	PIND, Taster1			; loope solange der Taster1 nicht wieder losgelassen wurde 
    rjmp 	T1entprellen 
    ldi		zl,low(my_HelloWorld*2)		; Z Pointer laden 
    ldi		zh,high(my_HelloWorld*2) 
    rcall	serout_string 
    ret   
; Ausgabe eines Strings aus dem Flash  serout_string: 
    lpm						; nächstes Byte aus dem Flash laden 
    and	        r0,r0				; = Null? 	     
    breq	serout_string_ende		; wenn ja, ->; Ende
serout_string_wait:
    sbis	UCSRA,UDRE			; Warten bis UDR für das nächste
						; Byte bereit ist
    rjmp	serout_string_wait
    out		UDR, r0
    adiw	zl:zh,1				; Zeiger erhöhen
    rjmp	serout_string			; nächstes Zeichen bearbeiten
serout_string_ende:
    ret	         				; zurück zum Hauptprogramm
 
my_HelloWorld:			.db "Hello World",10,0

 

Video, zur Demonstration

Im Video wird der serielle Port mittels eines Perl Scripts abgefragt.
Das geht natürlich auch mit Programmen wie Cutecom oder Putty.

Kategorien
ATMega8

ATMega8 – LED 1 und 2 über Taster T1 und T2 schalten

Pollin_Board_kleinDie meisten elektronischen Geräte / Schaltungen / Projekte müssen in irgendeiner Form auf Eingaben reagieren.
Sei es wie hier dargestellt auch ‘nur’ auf einen Taster.
Das Pollin Board bietet mehrere Taster, LED’s, einen Piepser und weitere Hardware zum ansteuern.


In diesem Beispiel wird die LED1 und 2 über Taster 1 und 2 angesteuert.

Wie in der Grafik zu erkennen, sind alle LED’s und Taster mit dem PortD verbunden.
PollinBoard_ATMega8_Taster_LED_Beispiel_Vorschau

Für dieses Beispiel werden keine weiteren Bauteile rund um das Evaluationsboard benötigt.

Der hier abgebildete Assemblercode ist mit vielen Kommentaren versehen.
Ich habe den Source auf Grundlage dieser Beispiele von Mikrocontroller.net aufgebaut.

Quellcode des Assemblerprogramms:

; avrdude -p m8 -c stk500v2 -P /dev/ttyACM0 -U flash:w:LED1_und_2_mit_Taster1_und_2.hex
; 9.8.2013 Das Programm soll sobald der Taster1 gedrückt wurde, die LED1 an bzw. ausschalten und
; sobald der Taster2 gedrückt wurde, die LED2 an bzw. ausschalten
; Das Programm ist zum grossen Teil aus 
; http://www.mikrocontroller.net/articles/AVR-Tutorial:_IO-Grundlagen
; übernommen. Dort gibt es noch viel weitere Infos und Tipps
.NOLIST
;.INCLUDE "/home/henry/Dokumente/Mikrocontroller/AVR-Assembler/AVR_Definitionsfiles/m8def.inc"
.INCLUDE "m8def.inc"
.LIST
 
.def temp 	= R16
 
.equ Taster1 	= PD2
.equ Taster2 	= PD3
.equ LED1 	= PD5
.equ LED2 	= PD6
 
; Port D, LED Pins auf Ausgang und Taster Pins auf Eingang schalten
 
	ldi	temp, (1<<LED1) | (1<<LED2)							
	out	DDRD, temp					; LED1/2 Pollin Evaluationsboard ,, PD5/6 auf Ausgang schalten	
 
Tastenabfrage:
	sbic	PIND, Taster1
	rjmp 	LED1Schalten					; Wenn Taster1 auf High (gedrückt), dann rufe LED1Schalten
	sbic	PIND, Taster2
	rjmp 	LED2Schalten					; Wenn Taster2 auf High (gedrückt), dann rufe LED2Schalten
	rjmp	Tastenabfrage					; zurück zur Tastenabfrage
 
LED1Schalten:
T1entprellen:
	sbic	PIND, Taster1					; loope solange der Taster1 nicht wieder losgelassen wurde
	rjmp 	T1entprellen
	sbic	PORTD, LED1					; überspringe die nächste Instruktion, wenn die LED1 ausgeschaltet ist
	rjmp	LED1ausschalten
LED1einschalten:	
	sbi	PORTD, LED1					; Setze das LED1 Bit in PORTD
	rjmp	EndeLED1schalten				; springe zu EndeLED1schalten
LED1ausschalten:
	cbi	PORTD, LED1					; Lösche das LED1 Bit in PORTD
EndeLED1schalten:	 
	rjmp 	Tastenabfrage					; zurück zum Hauptprogramm
 
LED2Schalten:
T2entprellen:
	sbic	PIND, Taster2					; loope solange der Taster2 nicht wieder losgelassen wurde
	rjmp 	T2entprellen
	sbic	PORTD, LED2					; überspringe die nächste Instruktion, wenn die LED2 ausgeschaltet ist
	rjmp	LED2ausschalten
LED2einschalten:	
	sbi	PORTD, LED2					; Setze das LED2 Bit in PORTD
	rjmp	EndeLED2schalten				; springe zu EndeLED2schalten
LED2ausschalten:
	cbi	PORTD, LED2					; Lösche das LED2 Bit in PORTD
EndeLED2schalten:	 
	rjmp 	Tastenabfrage					; zurück zum Hauptprogramm

 

Video, zur Demonstration

 

Kategorien
Raspberry Pi

Raspberry Pi – via UMTS ins Netz – Konfiguration | Einstellungen

RaspberryPi_A_UMTS_D
Raspberry Pi Model A connected via UMTS!

Ich habe mir relativ günstig bei Ebay einen ‘Medionmobile’ UMTS Stick ersteigert und zusätzlich bei Aldi ein Aldi Talk Starter-Paket gekauft.

Aldi bietet einen Tarif mit 150MB UMTS und danach GPRS Geschwindigkeit, für 3,99 im Monat und monatlich kündbar.
Es wird zwar ‘nur’ das Eplus Netz genutzt, aber das ist bei mir relativ gut verfügbar.

Kurzzusammenfassung: Was war nötig online zu gehen?

  1. wvdial installieren
  2. /etc/wvdial.conf anpassen
  3. ein zweizeiliges Bash Script für das Setzen der Simkarten PIN erstellen
  4. /etc/network/interfaces anpassen
  5. Verbindungsaufbau

1. wvdial installieren

pi@raspberrypi - $ sudo apt-get install wvdial
.
.
Success!  You can run "wvdial" to connect to the internet.
  (You can also change your configuration by editing /etc/wvdial.conf)
 
pi@raspberrypi - $

2. /etc/wvdial.conf anpassen

Dazu ist ein kleines bisschen Vorarbeit nötig.
Es ist wichtig den Pfad zu kennen, über den das UMTS Device angesprochen wird.
Nach dem Einstecken des Sticks – lsusb eingeben und sehen, ob der Stick erkannt wurde.

pi@raspberrypi ~ $ lsusb
Bus 001 Device 005: ID 12d1:1003 Huawei Technologies Co., Ltd. E220 HSDPA Modem / E230/E270/E870 HSDPA/HSUPA Modem
pi@raspberrypi ~ $

Achtung: Bei der Raspberry Pi Model B hat es nicht funktioniert den Stick direkt an der Pi zu betreiben, da die Stromversorgung zusammengebrochen ist. Der Betrieb über einen USB-Hub ging aber problemlos. Das Model A hält es aus, wohl weil die von Haus aus selbst weniger Strom verbraucht.

Die letzten Einträge von var/log/messages, zeigen zu welchem Pfad das UMTS Modem hinzugefügt wird. In meinem Fall /dev/ttyUSB0.

Feb 20 15:17:26 raspberrypi kernel: [   10.527167] usb 1-1.3: new high-speed USB device number 5 using dwc_otg

. . Feb 20 15:17:26 raspberrypi kernel: [ 11.313066] usbcore: registered new interface driver option Feb 20 15:17:26 raspberrypi kernel: [ 11.323480] USB Serial support registered for GSM modem (1-port) Feb 20 15:17:26 raspberrypi kernel: [ 11.334289] option 1-1.3:1.0: GSM modem (1-port) converter detected Feb 20 15:17:26 raspberrypi kernel: [ 11.345030] usb 1-1.3: GSM modem (1-port) converter now attached to ttyUSB0 Feb 20 15:17:26 raspberrypi kernel: [ 11.354849] option 1-1.3:1.1: GSM modem (1-port) converter detected Feb 20 15:17:26 raspberrypi kernel: [ 11.375418] usb 1-1.3: GSM modem (1-port) converter now attached to ttyUSB1

Nun habe ich die /etc/wvdial.conf für meinen Aldi – Medionmobile Zugang konfiguriert.

pi@raspberrypi /etc $ cat wvdial.conf 
[Dialer Defaults]
Phone = 
Username = 
Password = 
New PPPD = yes
 
[Dialer eplus]
Modem = /dev/ttyUSB0
Phone = *99#
Username = eplus
Password = gprs
Init3 = AT+CGDCONT=1,"IP","internet.eplus.de","0.0.0.0"
ISDN=0
Auto Reconnect=on
Stupid Mode=off
Idle Seconds=0
Auto DNS=on

3. ein zweizeiliges Bash Script für das Setzen der Simkarten PIN erstellen

Wer seine SIM Karte mit einer Pin gesichert hat, muss vor der Einwahl dafür sorgen, dass die PIN dem UMTS Modem auch bekannt ist.
Dazu dient folgendes Bash Script:

pi@raspberrypi /usr/local/bin $ sudo cat setPIN.sh
#!/bin/sh
echo "AT+CPIN=4711\n\r" > /dev/ttyUSB0

Und jetzt noch so absichern, dass nur Root rein schauen darf

pi@raspberrypi /usr/local/bin $ ls -al
insgesamt 352
-rwx--x--x  1 root staff     50 Feb 24 13:14 setPIN.sh

4. /etc/network/interfaces anpassen

Zum Schluss kommen noch 4 Zeilen in die /etc/network/interfaces

pi@raspberrypi - $ sudo cat /etc/network/interfaces ab auto ppp0
auto lo
 
iface lo inet loopback
iface eth0 inet dhcp
 
auto ppp0
iface ppp0 inet wvdial
provider eplus
pre-up /usr/local/bin/setPIN.sh
 
allow-hotplug wlan0
iface wlan0 inet manual
wpa-roam /etc/wpa_supplicant/wpa_supplicant.conf
iface default inet dhcp

pre-up /usr/local/bin/setPIN.sh -> verweist auf das Script zur PIN Übergabe.

5. Verbindungsaufbau

Die Verbindung baut sich sofort nach dem booten automatisch auf, vorausgesetzt der Stick steckt.

Nachträglich kann die Verbindung mit folgenden Kommandos auf und abgebaut werden:

pi@raspberrypi - $ sudo ifup ppp0
pi@raspberrypi - $ sudo ifdown ppp0
Kategorien
Raspberry Pi

Raspberry Pi – Keep alive zum Webserver senden

Keep_alive
Das schöne an der Raspberry Pi im Gegensatz zu Mikrocontrollern oder auch Arduino ist, dass die Kommunikation mit dem Internet sehr einfach ist.

Von Haus aus ist eine Netzwerkschnittstelle vorhanden. Eine UMTS – Karte bekommt man sicherlich auch ans Laufen, also eignet sich die Pi sehr gut um Daten / Messwerte ins Netz zu stellen.

Und wie so vieles beginnt dieses mit einem keep alive Signal, ein kleiner Ruf in die Welt, dass die Pi arbeitet und verfügbar ist.Dann noch ein kleines Script, was die Lebenssignale ansprechend darstellt (siehe ganz unten auf der Seite) und schon macht die Sache einen sehr positiven Eindruck.
Wie in der Grafik dargestellt, bedarf es nicht sehr viel, um ein solches ‘Mini’ Projekt umzusetzen.
Ein zeitlich gesteuertes Script (cron) ruft in regelmäßigen Abständen ein Script auf einem Webserver auf, welches einen Eintrag in einer Datenbank vornimmt.
Ruft ein Besucher die Webseite in der die Daten präsentiert werden sollen auf, werden durch ein weiteres serverseitiges Script die Daten zur Verfügung gestellt und präsentiert.

In den folgenden Ausführungen stelle ich die von mir verwendeten Scripts und die Präsentation der Werte am Ende vor.

Perl Script auf der Raspberry Pi

#!/usr/bin/perl -w
# Dieses Script startet ein php script auf meiner Webseite und übergibt via 
# POST Request die aktuelle Zeit, um zu zeigen, dass die RaspberryPi am Leben ist.
# Henry Koch - 20.10.2012 
use strict;
use LWP::UserAgent;
use HTTP::Request::Common qw(POST);
my $CTIME_String = localtime(time);
 
my $browser = LWP::UserAgent->new;
my $resp = 	(POST 'www.xyz.de/dir/dir/script.php', 
			['Timestamp' => $CTIME_String);
 
my $response_to_discard = $browser->request($resp);
print $response_to_discard;

 

PHP Script zum Eintrag der Timestamps in die Web-Datenbank

<?php
//20.2.2013 Dieses Script wird von meiner Raspberry Pi aufgerufen und 
//schreibt Keep alive Timestamps in eine Datenbank Tabelle
//Die Anzahl der Tabelleneinträge ist auf 432 begrenzt 
 
//Anpassung erforderlich
$DBHost   = "HOST";
$DBName   = "DB";
$DBUser   = "ICH";
$DBPasswd = "DU";
$conn = mysql_connect($DBHost, $DBUser, $DBPasswd);
mysql_select_db($DBName);
 
//maximal 432 Datensätze in der Tabelle halten
$sql = "SELECT `lfd_Nr` FROM `keepalive_Tabelle` ORDER BY lfd_Nr 
	DESC LIMIT 430,1";
 
$result = mysql_query($sql);
$row = mysql_fetch_assoc($result);
//laufende Nummer des 432-sten Datensatzes, also des ältesten Erlaubten
$nr = $row['lfd_Nr'];
mysql_free_result($result);
 
$sql = "DELETE FROM `keepalive_Tabelle` WHERE `lfd_Nr` < " . $nr . " ";
$result = mysql_query($sql);
mysql_free_result($result);
 
//Insert Timestamps (dann sind es wieder 432)
$sql = "
	INSERT INTO `keepalive_Tabelle` ( `lfd_Nr`, `ts_Garage`, 
					  `ts_Server`, `RemoteIP` )
	VALUES (
		'', '" . $_POST['Timestamp'] . "', '" . time() . "', '" . 
			 $_SERVER['REMOTE_ADDR'] . "'
	);
";
$result = mysql_query($sql);
mysql_free_result($result);
mysql_close($conn);
echo "Keepalive was run successfully";
?>

 

Parameter der verwendeten Tabelle

CREATE TABLE `keepalive_tabelle` (
  `lfd_Nr` INT(11) NOT NULL AUTO_INCREMENT,
  `ts_Garage` BIGINT(20) NOT NULL,
  `ts_Server` BIGINT(20) NOT NULL,
  `RemoteIP` VARCHAR(25) COLLATE latin1_german1_ci NOT NULL,
  PRIMARY KEY  (`lfd_Nr`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 COLLATE=latin1_german1_ci 
  AUTO_INCREMENT=1 ;

 

PHP Script zum Aufarbeiten der Daten

<?php
//20.2.2013 Dieses Script dient zur Aufbereitung der keep alive Daten,
//die die Pi gesendet hat
//Anpassung erforderlich
$DBHost = "HOST";
$DBName = "DB";
$DBUser = "ICH";
$DBPasswd = "DU";
$conn = mysql_connect($DBHost, $DBUser, $DBPasswd);
mysql_select_db($DBName);
 
$sql = " SELECT ts_Server, lfd_Nr
FROM keepalive_tabelle
ORDER BY lfd_Nr DESC";
 
$rows = mysql_query($sql);
$first = true;
$totalCount = 0;
$tage = null;
while ($row = mysql_fetch_assoc($rows)) {
if ($first) {
$totalCount = $row['lfd_Nr'];
$first = false;
}
$timestamp = $row['ts_Server'];
if (isset($tage[date('d.n.Y', $timestamp)])) $trenner = " - ";
else $trenner = "";
$tage[date('d.n.Y', $timestamp)] .= $trenner . date('H:i', $timestamp);
}
mysql_free_result($rows);
mysql_close($conn);
echo "<h3>Die Pi hat insgesamt $totalCount Keep alive Signale gesendet</h3>";
echo "<p>Das sind die letzten 432!</p>";
 
foreach ($tage as $key => $value){
echo "<p><b>" . $key . "</b><br \>" . $value . "</p>";
}
?>

 

Präsentation der Zeitpunkte, zu denen sich die Raspberry Pi gemeldet hat.

Kategorien
Raspberry Pi

Intro – RaspberryPI

Seit November 2012 bin ich stolzer Besitzer einer Raspberry Pi. Nach Monate langer Wartezeit, war ich dann doch endlich an der Reihe :-).

Nun werde ich hier von Zeit zu Zeit berichten, was ich so mit dem Teil anstelle.
Mir schwebt vor das embedded Linux System in die Steuerung zur Erzeugung und dem Verbrauch von Sonnenenergie und Windenergie in meiner Garage mit einzubinden.

Da kommen stehen am Anfang die ersten Herausforderungen an, da das Modell B mit bis zu 5 Watt doch recht viel Strom verbraucht.
Gerade in den Wintermonaten gestaltet sich das als recht unvorteilhaft. Es gibt aber reichlich Literatur und Hinweise zum Thema im Netz und so versuche ich mal Fortschritte zu machen.
Der erste Eindruck, was es so gibt für 35 Euro: Ich bin sicher, dass die ersten Weltraumflüge wesentlich schlechter ausgerüstet waren! – Damit kann man bestimmt zum Mond fliegen!