Author Topic: Cubietruck GPIO Ports LED Blink  (Read 9442 times)

Offline TFK-Killermatrix

  • Newbie
  • *
  • Posts: 13
  • Karma: +0/-0
    • View Profile
Cubietruck GPIO Ports LED Blink
« on: April 06, 2014, 05:49:30 pm »
Hallo Zusammen,

hat von Euch jemand schon mal sich mit den Expansion Ports beschäftigt.
Wie man diese Programmieren oder ansteuern kann?
Ich hab mir mal das Videotutorial angesehen, musste aber anschließend feststellen das ich es mit dem Cubietruck so nicht hinbekomme.

Hat hier jemand also schon erste Erfahrungen gesammelt wie man eine LED mit Hilfe von z.B. Python über einer der Expansion Ports ansteuern kann ?  Oder ein script dafür dann man sie schalten oder blinken lassen kann ?

Ich würde mich über ein paar Hilfestellungen freuen.

Danke

TFK
« Last Edit: April 11, 2014, 01:04:24 pm by TFK-Killermatrix »

klagges

  • Guest
Re: Extension Ports Cubietruck
« Reply #1 on: April 07, 2014, 06:02:29 am »
Für den einstieg solltest du dir das mal ansehen

http://docs.cubieboard.org/tutorials/common/gpio_on_lubuntu

Mfg

Offline TFK-Killermatrix

  • Newbie
  • *
  • Posts: 13
  • Karma: +0/-0
    • View Profile
Re: Extension Ports Cubietruck
« Reply #2 on: April 07, 2014, 09:21:41 am »
Hi klagges,

jo das sieht doch schon mal vielversprechend aus. Ich werde mich heute Abend mal direkt daran setzen und schauen ob ich das abarbeiten bzw. nachvollziehen kann, ob es so funzt wie es auf dem Link beschrieben steht.

danke erstmal für den Hinweis. Ich melde mich dann später wieder mit ein paar Ergebnissen.

MFG

TFK

Offline TFK-Killermatrix

  • Newbie
  • *
  • Posts: 13
  • Karma: +0/-0
    • View Profile
Re: Extension Ports Cubietruck
« Reply #3 on: April 08, 2014, 10:09:41 am »
so da bin ich wieder mit den ersten Ergebnissen.

der Link war schon mal ein wenig hilfreich gewesen, sodas ich jetzt zumindest weis wie man die Pins aktivieren bzw ansteuern kann. Hab mir mal PIN PC19-PC20 aktiviert und darüber jeweils eine LED angesteuert. Jetzt geht es halt weiter, wie bekomme ich die zum blinken. Nun such ich ein passendes Script wo ich eine kleine blink Steuerung habe bzw. dann auch darauf aufbauen oder erweitern kann. Vielleicht hat da noch jemand eine Idee, wie man diese im Cubietruck mit nen seperaten Script ansteuern kann.

MFG

TFK

klagges

  • Guest
Re: Extension Ports Cubietruck
« Reply #4 on: April 09, 2014, 01:44:08 am »
Schau dir das c programm an das auf der seite von dem link steht das lässt deinen ausgang blinken :-)

Die ein / ausgänge die du mit C ansteuerst brauchst du nicht in der script.fex eintragen das geht auch so

Offline TFK-Killermatrix

  • Newbie
  • *
  • Posts: 13
  • Karma: +0/-0
    • View Profile
Re: Extension Ports Cubietruck
« Reply #5 on: April 09, 2014, 09:36:23 am »
Hi Klagge,

also ich bin gerade etwas am hängen, mit der Portdefinierung.

in der script.bin habe ich ja den Port definiert den ich laut dem tutorial aktivieren muss. Jedoch
muss der in den c script auch definiert werden. Nur wie muss das dort aussehen.
Ich hab 2 Pins aktiviert gehabt.
PC19 und PC20
 denn ein PD01 oder so hat der Cubietruck ja nicht.
also wie muss die portdefinierung in dem C script aussehen damit ich den richtigen Port ansprechen kann.

danke im vorraus

MFG

TFK

klagges

  • Guest
Re: Extension Ports Cubietruck
« Reply #6 on: April 09, 2014, 01:08:26 pm »
So sollte es klar werden.  ;D

Code: [Select]
#include <stdlib.h>
#include <stdio.h>

#include "gpio_lib.h"
#define PD0    SUNXI_GPD(0)
#define PD1    SUNXI_GPD(1)
#define PD2    SUNXI_GPD(2)
#define PD3    SUNXI_GPD(3)
#define PD4    SUNXI_GPD(4)
//##########DEIN PIN ZB PB16#######
#define PB3   SUNXI_GPB(16)
//############################

#define MISO    SUNXI_GPE(3)
#define MOSI    SUNXI_GPE(2)
#define SCK     SUNXI_GPE(1)
#define CS      SUNXI_GPE(0)

int main()
{
    if(SETUP_OK!=sunxi_gpio_init()){
        printf("Failed to initialize GPIO\n");
        return -1;
    }
//##### Hier wird der PIN PB16 als ausgang deklariert
    if(SETUP_OK!=sunxi_gpio_set_cfgpin(PB16,OUTPUT)){
        printf("Failed to config GPIO pin\n");
        return -1;
    }

    int i;
// anzahl der wiederholungen
    for(i=0;i<5;i++){
//####### Hier wird der ausgang PB16 auf High gesetzt
        if(sunxi_gpio_output(PB16,HIGH)){
            printf("Failed to set GPIO pin value\n");
            return -1;
        }
// Kurze unterbrechung
        usleep(500000);
//####### Ausgang auf low setzen
        if(sunxi_gpio_output(PB16,LOW)){
            printf("Failed to set GPIO pin value\n");
            return -1;
        }
        usleep(500000);
    }

    sunxi_gpio_cleanup();

    return 0;

}

Offline TFK-Killermatrix

  • Newbie
  • *
  • Posts: 13
  • Karma: +0/-0
    • View Profile
Re: Extension Ports Cubietruck
« Reply #7 on: April 09, 2014, 03:38:10 pm »
Sorry aber deine Logic dahinter verstehe ich jetzt mal garnicht.
jetzt haste mich total verwirrt..... ???
Ich habe es mit PB3 versucht und PC19 usw.... aber das funzt nicht.
Eine weitere Frage die sich mir stellt.
Wird die Änderung in der Script.bin datei dafür überhaupt benötigt ?
Oder sollte man die so im Orginal belassen wie sie steht und dort keine Pins definieren ?

So wofür steht #define PB3 ist das der PIN auf dem Cubietruck ? denn wenn ja es gibt diesen Port der liegt in der Reihenfolge auf 20.

und wofür steht das SUNXI_GPB(16)  orginal script (SUNXI_GPD(0) ? Was für ein Zahlenwert steht da in den Klammern bzw. wofür steht der ?





Also nochmal ich habe in der script.bin die parameter geändert und die 2 Pins PC19 und PC20 aktiviert. die kann ich im oberen teil der Anleitung so wie beschrieben auch ansprechen so das ich die mit 1 und 0 schalten kann. das funzt. ok

Aber ich möchte das script testen mit genau den selben pins. Jetzt kommst du mir mit PB3 und PB16 das verstehe ich den zusammenhand irgendwie nicht. selbst wenn ich das so eingeben wie du schreibst und ich dann das kabel auf den PB3 (20) auf den Port stecke und dann das script mit ./gpio ausführe passiert da garnichts.

Also bitte erkläre mir das etwas genau wie die Difinition da genau lauten muss mit den Pins die ich auch nutzen will oder mit dem Pin den du meinst. Aber nicht Cubieboard 1 oder 2 sondern Cubietruck. Bitte halte dich an die Pinbelegung auf der Grafik. Ich möchte das gern nachvollziehen können^^ ;D .
Desweiteren wenn ich in der script.bin da eine Änderung anpassen muss damit dieses C Script funzt dann bitte auch mit angeben wenn dies nicht notwendig ist und alles auf standard stehen bleiben kann dann bitte sagen.

Ich hoffe das du mir jetzt nochmal genau weiterhelfen kannst sonst raff ich das garnicht. Und bitte nicht von den pins abweichen.


danke im Vorraus
MFG

TFK

Offline TFK-Killermatrix

  • Newbie
  • *
  • Posts: 13
  • Karma: +0/-0
    • View Profile
Re: Extension Ports Cubietruck
« Reply #8 on: April 09, 2014, 06:29:15 pm »
OK ich hab die Lösung jetzt selber gefunden. Jedoch weis ich bei einigen Fragen die in dem letzten Post von mir stehen leider noch keine Antwort, wäre nett wenn du es mir doch trotzdem erklären kannst.

Desweiteren, jetzt hab ich ja eine LED zum blinken gebracht. Was ist aber wenn ich 2 LED auf 2 unterschiedlichen Ports blinken lassen will. Wie muss ich das script dafür anpassen.
Bisher bin ich hingegangen und habe die einzelnen Module immer jeweils den ersten kopiert und mit dem Port gesetzt. Jedoch meldet er mir beim compilieren ein error in

gpio.c: In function ´main´:
gpio.c:69:1: error: expected declaration or statement at end of input

vielleicht hast du ja darauf auch eine Antwort, wie man das umsetzt.

Code: [Select]
#include <stdlib.h>
#include <stdio.h>

#include "gpio_lib.h"
#define PD0    SUNXI_GPD(0)
#define PD1    SUNXI_GPD(1)
#define PD2    SUNXI_GPD(2)
#define PD3    SUNXI_GPD(3)
#define PD4    SUNXI_GPD(4)

#define PB3      SUNXI_GPB(3)
#define PC19    SUNXI_GPC(19)

#define MISO    SUNXI_GPE(3)
#define MOSI    SUNXI_GPE(2)
#define SCK     SUNXI_GPE(1)
#define CS      SUNXI_GPE(0)

int main()
{
    if(SETUP_OK!=sunxi_gpio_init()){
        printf("Failed to initialize GPIO\n");
        return -1;
    }

    if(SETUP_OK!=sunxi_gpio_set_cfgpin(PB3,OUTPUT)){
        printf("Failed to config GPIO pin\n");
        return -1;
    }
//### modul kopiert und hintendran gefügt und Port geändert ###/
    if(SETUP_OK!=sunxi_gpio_set_cfgpin(PC19,OUTPUT)){
        printf("Failed to config GPIO pin\n");
        return -1;
    }

    int i;
    for(i=0;i<10;i++){
        if(sunxi_gpio_output(PB3,HIGH)){
            printf("Failed to set GPIO pin value\n");
            return -1;
        }
//### i durch a ersetzt und Anzahl der Blink cycle erhöht ###//
    int a;
    for(a=0;a<10;a++){
        if(sunxi_gpio_output(PC19,HIGH)){
            printf("Failed to set GPIO pin value\n");
            return -1;
        }

        usleep(500000);
        if(sunxi_gpio_output(PB3,LOW)){
            printf("Failed to set GPIO pin value\n");
            return -1;
        }
//### das modul hinter dem anderen kopiert und den Port dort geändert ###//
        usleep(500000);
        if(sunxi_gpio_output(PC19,LOW)){
            printf("Failed to set GPIO pin value\n");
            return -1;
        }
        usleep(500000);
    }

    sunxi_gpio_cleanup();

    return 0;

}

da ich kein plan habe ob man das so machen kann weis ich nicht ob das total schrott ist oder ob da nur ein kleiner Fehler ist den ich jetzt übersehen habe und der deswegen die compilierung abbricht.

Ich hoffe du kannst da helfen.

vielen Dank im vorraus

MFG

TFK

klagges

  • Guest
Re: Extension Ports Cubietruck
« Reply #9 on: April 10, 2014, 03:27:51 am »
Hi ich habe es jetzt nur kurz auf dem handy überflogen.
Dsieht aus als wenn du in der for schleife eine weitere öffnest und wohl die zweite schleife dann nicht schließt dedhalb wohl der kompilierungs fehler.

Nichts desto trotz wird das so nicht funkionieren da sonst die zweite schleife bei jedem durchlauf der ersten ausgeführt werden würde.

Entweder über 2 getrennte Programme. Oder irgendwie über threads aber soweit reichen meine kentnisse auch nicht.

Vielleicht fällt mir noch was ein . . .
:-)

Offline TFK-Killermatrix

  • Newbie
  • *
  • Posts: 13
  • Karma: +0/-0
    • View Profile
Re: Cubietruck GPIO Ports LED Blink
« Reply #10 on: April 11, 2014, 11:37:19 am »
So ich habs jetzt hinbekommen und ein funktionsfähigen C Code geschrieben bei dem 2 LED´s an unterschiedlichen Ports am Cubietruck angesteuert werden können. Sie blinken abwechselnd in einem sauberen Rhytmus. Dieses Script sollte jetzt durch weitere LED´s bzw. Ports erweitert werden können.

Wichtig ist wohl zu erwähnen, was leider nirgends angegeben wurde das man die drei Befehle zum Compilieren der Dateien bei jeder Änderung durchführen muss, bevor die Anwendung mit den neuen Änderungen gestartet werden kann.

Code: [Select]
gcc gpio_lib.c -c  ///## hier keine Änderung durchführen ##///
gcc gpio.c -c           ///##Wenn der Name der Datei geändert wird z.B. gpio1.c ##///
gcc gpio.o gpio_lib.o -o gpio  ///##dann sollte der an 2  Stellen hier auch geändert werden. ##//
Beispiel: gcc gpio1.o gpio_lib-o -o gpio1
./gpio  ///## gestartet wird dann die Datei mit  ./gpio1  ##///

Deswegen funktioniert es bei mir anfangs auch nicht mit der Port Definierung. Nun ja ich hoffe es hilft anderen bei der Umsetzung eigener Ideen, LED´s mit Hilfe der GPIO´s am Cubietruck ansteuern zu lassen.

Code: [Select]
#include <stdlib.h>
#include <stdio.h>

#include "gpio_lib.h"
#define PD0    SUNXI_GPB(0)
#define PD1    SUNXI_GPD(1)
#define PD2    SUNXI_GPD(2)
#define PD3    SUNXI_GPD(3)
#define PD4    SUNXI_GPD(4)

#define PB3   SUNXI_GPB(3)
#define PC19  SUNXI_GPC(19)

#define MISO    SUNXI_GPE(3)
#define MOSI    SUNXI_GPE(2)
#define SCK     SUNXI_GPE(1)
#define CS      SUNXI_GPE(0)

int main()
{
    if(SETUP_OK!=sunxi_gpio_init()){
        printf("Failed to initialize GPIO\n");
        return -1;
    }

    if(SETUP_OK!=sunxi_gpio_set_cfgpin(PB3,OUTPUT)){
        printf("Failed to config GPIO pin\n");
       return -1;
    }

    if(SETUP_OK!=sunxi_gpio_set_cfgpin(PC19,OUTPUT)){
        printf("Failed to config GPIO pin\n");
       return -1;
    }

    int i;
    for(i=0;i<100;i++){
        if(sunxi_gpio_output(PB3,HIGH)){
            printf("Failed to set GPIO pin value\n");
            return -1;
        }
        usleep(200000);
        if(sunxi_gpio_output(PB3,LOW)){
            printf("Failed to set GPIO pin value\n");
            return -1;
        }

        if(sunxi_gpio_output(PC19,HIGH)){
            printf("Failed to set GPIO pin value\n");
            return -1;
        }

        usleep(200000);
        if(sunxi_gpio_output(PC19,LOW)){
            printf("Failed to set GPIO pin value\n");
            return -1;
        }

    }

    sunxi_gpio_cleanup();

    return 0;

}

Dir "klagge" danke nochmal für deine Geduld. Ich hoffe wir können weiterhin hier zusammen experimentieren.

meta: Cubietruck GPIO LED C Script Blink LED

MFG

TFK
« Last Edit: April 11, 2014, 01:04:50 pm by TFK-Killermatrix »

Offline TFK-Killermatrix

  • Newbie
  • *
  • Posts: 13
  • Karma: +0/-0
    • View Profile
Re: Cubietruck GPIO Ports LED Blink
« Reply #11 on: April 12, 2014, 04:18:57 pm »
Hier mein aktuelles Script für den Cubietruck und seine LED ansteuerung.

Es sind dort einige Muster angelegt. Könnte man bestimmt kürzer schreiben aber wer dazu Interesse hat kann ja mal das Script so verkürzen so das es klein ist und trotzdem den selben Musterablauf beinhaltet.

Breadboard  Cubietruck Port Belegung


Breadboard Layout


CHN8
http://img4web.com/view/J9NCQ
CHN9
http://img4web.com/view/QMM4VV

so sieht es fertig aus
https://www.youtube.com/watch?v=Y7Gi61Q1D_8&feature=youtu.be

siehe Download Attachment
« Last Edit: April 13, 2014, 06:09:54 pm by TFK-Killermatrix »

Offline JuSchu

  • Newbie
  • *
  • Posts: 13
  • Karma: +0/-0
    • View Profile
Re: Cubietruck GPIO Ports LED Blink
« Reply #12 on: July 10, 2014, 01:45:26 pm »
Ich hatte auch das Problem, dass mit den Shell-Befehlen alles funktioniert hat, nur sobald ich mit C ran gegangen bin gar nichts mehr.
Allen anderen die über die Forums-Suche oder Google hier aus dem gleichen Grund landen, würde ich WiringCB empfehlen.
Das ist eine Library die erst von Arduino für den Raspberry Pi portiert wurde und dann auch noch fürs Cubieboard. Es lässt sich mit C/C++ und Python nutzen.
Und es gibt unter http://wiringpi.com/reference/ auch eine Referenz für die Pi Version, die sich von der fürs Cubieboard aber nicht besonders unterscheiden sollte.

Hier noch 3 Videos vom selben User für die ersten Schritte.
https://www.youtube.com/watch?v=nO_ehm1RzoY
https://www.youtube.com/watch?v=RKRl0vesvPc (nur für das Verbinden der LED. Kann eigentlich übersprungen werden)
https://www.youtube.com/watch?v=cGhfpfbnaeQ

Es funktioniert auch ohne die Änderungen in script.bin und auch ohne das Kernelmodul gpio-sunxi.
Die Numerierung der Pins läuft allerdings etwas anders. Das wird im 3. Video bei 2:32 erklärt.
Außerdem ist wichtig, dass man bei C-Programmen dem Compiler folgende Parameter übergibt "-lwiringPi -lpthread" damit die richtigen Header glinked werden.

@TFK-Killermatrix
Falls du weiter mit C an solchen Sachen programmieren willst, solltest du dringen deine C Kenntnisse ausbauen. Ich sehe ganz eindeutig, dass du vor allem deswegen Verständnisprobleme hattest. Und wenn man Werkzeug benutzt, das man nicht richtig versteht, wird man immer wieder solche Probleme haben.
Sachen wie Konstanten für den Präprozessor (#define) und, dass man nach jeder Änderung neu kompilieren muss sind eigentlich absolute Basics und deswegen wurde da auch nicht explizit drauf hingewiesen.
Außerdem gibt es sowas wie ein "C Skript" überhaupt nicht. Und das ist der springende Punkt. Skriptsprachen wie Python müssen nicht manuell für jede Ausführung neu kompiliert werden und man übergibt zur Ausführung die Quelldatei selbst an den Interpreter.
Maschinen nähere Sprachen wie C/C++ muss man aber jedes mal neu kompilieren und man ruft auch nicht die Quelldatei selbst auf, sondern das was der Compiler ausspuckt.
Das bedeutet natürlich, dass man wegen einer kleinen Änderung immer wieder mehrer Befehle eintippen muss. Aber man kann auch mehrere Befehle zu einem mit && verketten. Mit folgendem Befehl habe ich mein Testprogramm übersetzt und konnte den gleichen Befehl mit der Pfeil-Nach-Oben-Taste immer wieder neu aufrufen.
Code: [Select]
clear && gcc test.c -o test -lwiringPi -lpthread && sudo ./testSobald einer der Befehle einen Fehler verursacht (zB einen Compile-Fehler) werden nachfolgende Befehle auch nicht mehr ausgeführt. Sonst würde bei einem Compile-Fehler direkt die letzte korrekte Version gestartet werden, die in diesem Moment eher uninteressant ist.

Du musst dir um C zu lernen auch kein teures Buch kaufen. Der Verlag Galileo Computing stellt eine ganze Menge seiner Bücher gratis zur Verfügung: http://openbook.galileocomputing.de/c_von_a_bis_z/

Falls du die Python Version von WiringCB ausprobieren willst, gibt es da auch ein Buch von denen: http://openbook.galileo-press.de/python/

Du musst aber nicht jeweils das komplette Buch lesen. Das sind ganz schön dicke Schinken. Die ersten paar Kapitel sollten fürs erste reichen.
Skriptsprachen (zB Python) sind prinzipiell einfacher als Maschinen nähere Sprachen (zB C/C++). Python ist von der Syntax her teilweise sogar so, als würde man mit einem Menschen reden.