BrickPi3: Quick Guide (mit C/C++ & "stackable" Shields)

Atmel, PIC, VEX, Fischertechnik

Moderator: Moderatoren

Benutzeravatar
HaWe
Administrator
Administrator
Beiträge: 5385
Registriert: 11. Jan 2006 21:01
Wohnort: ein kleiner Planet in der Nähe von Beteigeuze

BrickPi3: Quick Guide (mit C/C++ & "stackable" Shields)

Beitragvon HaWe » 16. Apr 2017 09:04

hallo,
auf meine Anfrage hin hat Matthew Richardson (aka "mattallen37") von Dexter Industries für deren BrickPi3 jetzt auch begonnen, die ersten C/C++ API libs zur Verfügung zu stellen und außerdem auch die Firmware der BrickPi3 Shields zu überarbeiten, sodass sie jetzt "stackable = stapelbar" sind, d.h., man kann mehrere davon aufeinanderstecken und hat dann ein Vielfaches der jew. IOs.

Bild

Kurzer Einblick in die C++ API

Hier sind die ersten Links:

https://github.com/DexterInd/BrickPi3/t ... Software/C

ein Beispiel, um die Shield IDs auszulesen und zu initialisieren (Stand 15.4.2017):
https://github.com/DexterInd/BrickPi3/b ... .c#L40-L41

Code: Alles auswählen

/*
 *  https://www.dexterindustries.com/BrickPi/
 *  https://github.com/DexterInd/BrickPi3
 *
 *  Copyright (c) 2017 Dexter Industries
 *  Released under the MIT license (http://choosealicense.com/licenses/mit/).
 *  For more information, see https://github.com/DexterInd/BrickPi3/blob/master/LICENSE.md
 *
 *  This code is an example for reading BrickPi3 information
 *
 *  Results: Print information about the attached BrickPi3.
 *
 *  Example compile command:
 *    g++ -o program "info.c"
 *  Example run command:
 *    sudo ./program
 *
 */

#include "BrickPi3.cpp" // for BrickPi3
#include <stdio.h>      // for printf

BrickPi3 BP; // Create a BrickPi3 instance with the default address of 1
//BrickPi3 BP_7(7); // Create a BrickPi3 instance with address 7

int main(){
  //BrickPi3_set_address(1, ""); // set BrickPi3 with any id to the default address of 1
  //BrickPi3_set_address(7, "192A0F96514D4D5438202020FF080C23"); // set BrickPi3 with id 192A0F96514D4D5438202020FF080C23 to address 7
 
  BP.detect(); // Make sure that the BrickPi3 is communicating and that the firmware is compatible with the drivers.
 
  char string[33]; // Room for the 32-character serial number string plus the NULL terminator.
 
  BP.get_manufacturer(string);
  printf("Manufacturer    : %s\n", string);
 
  BP.get_board(string);
  printf("Board           : %s\n", string);
 
  BP.get_id(string);
  printf("Serial Number   : %s\n", string);
 
  BP.get_version_hardware(string);
  printf("Hardware version: %s\n", string);
 
  BP.get_version_firmware(string);
  printf("Firmware version: %s\n", string);
 
  printf("Battery voltage : %.3f\n", BP.get_voltage_battery());
  printf("9v voltage      : %.3f\n", BP.get_voltage_9v());
  printf("5v voltage      : %.3f\n", BP.get_voltage_5v());
  printf("3.3v voltage    : %.3f\n", BP.get_voltage_3v3());
}




Weitere Beispiele im oben verlinkten Github "Examples" Ordner

Benutzeravatar
HaWe
Administrator
Administrator
Beiträge: 5385
Registriert: 11. Jan 2006 21:01
Wohnort: ein kleiner Planet in der Nähe von Beteigeuze

Re: BrickPi3: Quick Guide (mit C/C++ & "stackable" Shields)

Beitragvon HaWe » Gestern 11:07

Inhalt des Basis Kits:

(Bezugsquelle: Generation Robots, Frankreich, ca. 130 EUR inkl. Versand;
https://www.generationrobots.com/de/402 ... e-kit.html
momentan leider noch keine anderen Händler für Deutschland gefunden!)

brickPi3_0.jpg


brickPi3-1.jpg


( allerdings keine Beschreibung dabei! )


Aufbau-Anleitung:
https://www.dexterindustries.com/BrickP ... g-started/
https://www.dexterindustries.com/BrickP ... ed/basics/
Gruß,
HaWe
±·≠≈²³αβγδε∂ζλμνπξφωΔΦ≡ΠΣΨΩ∫√∀∃∈∉∧∨¬⊂⊄∩∪∅∞®
NXT NXC SCHACHROBOTER: https://www.youtube.com/watch?v=Cv-yzuebC7E

Benutzeravatar
HaWe
Administrator
Administrator
Beiträge: 5385
Registriert: 11. Jan 2006 21:01
Wohnort: ein kleiner Planet in der Nähe von Beteigeuze

Re: BrickPi3: Quick Guide (mit C/C++ & "stackable" Shields)

Beitragvon HaWe » Gestern 12:33

Montieren auf Standard-RaspberryPi- Abstandhalter: leider nicht möglich !

Entgegen Aussage von Dexter Ind. ist es nicht möglich, die BrickPi3 Shields mit 4 normalen Abstandshaltern zu befestigen -
es sind nur 2 Löcher für die Befestigung vorhanden, keine 4 wie eigentlich erforderlich, denn die restlichen 2, die nötig wären, sind mit Lego-Plugs verbaut.
(17mm wie angegeben gingen eh nicht, weil der stacking header vom BrickPi3 Shield nur 14mm hoch ist, aber das ist natürlich nur das allerkleinste Problem).

Zum anderen hat der BrickPi3 nur 26 Pins (wie der alte Raspi B), nicht 40 wie der neuere B+ und 2+3. Oben drauf lassen sich demnach überhaupt keine 40er HATs mehr draufsetzen....

BrickPi3-2.jpg


BrickPi3-3.jpg
Gruß,
HaWe
±·≠≈²³αβγδε∂ζλμνπξφωΔΦ≡ΠΣΨΩ∫√∀∃∈∉∧∨¬⊂⊄∩∪∅∞®
NXT NXC SCHACHROBOTER: https://www.youtube.com/watch?v=Cv-yzuebC7E

Benutzeravatar
HaWe
Administrator
Administrator
Beiträge: 5385
Registriert: 11. Jan 2006 21:01
Wohnort: ein kleiner Planet in der Nähe von Beteigeuze

Re: BrickPi3: Quick Guide (mit C/C++ & "stackable" Shields)

Beitragvon HaWe » Gestern 14:07

Allgemeine Links für Anfänger
(nicht spezifisch für C Programmierer):


https://www.dexterindustries.com/BrickP ... g-started/

Assemble The Case
The SD Card
Powering Up
Using the Raspberry Pi
Controlling the BrickPi
Attaching LEGO
Programming Your Robot



Installation von Raspbian:
BrickPi3 läuft mit den Standard-Raspbian SD Cards, wie sie z.B. automatisch von NOOBS erstellt und installiert werden:

https://www.raspberrypi.org/downloads/noobs/

Wichtig:
Nach jeder Neu-Installation und vor jeder neuen Zusatzinstallation immer obligatorisch erst einmal:

Code: Alles auswählen

sudo apt-get update
sudo apt-get upgrade
#dann
sudo reboot now
#dann
sudo apt-get autoremove


Installation der BrickPi3-Driver:
https://github.com/DexterInd/BrickPi3/b ... /README.md

Clone this repository onto the Raspberry Pi:

Code: Alles auswählen

sudo git clone http://www.github.com/DexterInd/BrickPi3.git /home/pi/Dexter/BrickPi3

Run the install script:

Code: Alles auswählen

 sudo bash /home/pi/Dexter/BrickPi3/Install/install.sh


Reboot the Raspberry Pi to make the settings take effect:

Code: Alles auswählen

sudo reboot


matt hat geschrieben: When you install the BrickPi3 software, the C++ drivers and examples are included (they get installed in the directory /home/pi/Dexter/BrickPi3/Software/C). For compiling, see the example compile command in the C examples. To compile the examples for testing, I just put the BrickPi3.h and BrickPi3.cpp files in the same directory as the program I was compiling (e.g. info.c).


Zum Verbindungstest kann dieses Python-Programm verwendet werden:

Code: Alles auswählen

python3 /home/pi/Dexter/BrickPi3/Software/Python/Examples/Test_Connected.py

Achtung: Es gibt einen Fehler aus, wenn die Firmware Version zu alt ist, auch wenn sonst alles ok sein sollte.

Check / Update Firmware:

matt hat geschrieben:To check the firmware version, you can either run the python example "Read_Info.py" or you can compile and run the C program "info.c".

You can update the firmware as described here:
https://github.com/DexterInd/BrickPi3/b ... /README.md

Code: Alles auswählen

python3 /home/pi/Dexter/BrickPi3/Software/Python/Examples/Read_Info.py

bei mir war es ver 1.0.1, verlangt wird 1.4.x, daher:

Code: Alles auswählen

sudo bash /home/pi/Dexter/BrickPi3/Firmware/brickpi3samd_flash_firmware.sh




spätere Driver- und C++ Library-Updates:

Code: Alles auswählen

sudo rm -rf /home/pi/Dexter/BrickPi3
#dann erneut
sudo git clone http://www.github.com/DexterInd/BrickPi3.git /home/pi/Dexter/BrickPi3
sudo bash /home/pi/Dexter/BrickPi3/Install/install.sh
sudo rebbot




Trouble Shooting:

https://www.dexterindustries.com/BrickP ... -brickpi3/
Gruß,
HaWe
±·≠≈²³αβγδε∂ζλμνπξφωΔΦ≡ΠΣΨΩ∫√∀∃∈∉∧∨¬⊂⊄∩∪∅∞®
NXT NXC SCHACHROBOTER: https://www.youtube.com/watch?v=Cv-yzuebC7E

mattallen37
Weniger als 15 Beiträge
Weniger als 15 Beiträge
Beiträge: 14
Registriert: 23. Jun 2011 00:07

Re: BrickPi3: Quick Guide (mit C/C++ & "stackable" Shields)

Beitragvon mattallen37 » Gestern 17:18

Deutsch: Wie ich in der Dexter Industries Foren zum Stapeln erwähnt habe, 17mm oder 18mm Pfosten sollten gut funktionieren, wenn Sie direkt an eine Raspberry-Pi anschließen, aber vielleicht nicht, wenn Sie eine Verbindung zu einem anderen Brett herstellen. Es gibt nur zwei Befestigungslöcher, denn bei allen Motor- und Sensoranschlüssen gibt es keinen Platz für vier, und in der Standardkonfiguration (mit dem Acrylgehäuse) werden die Montagelöcher nicht einmal benutzt.

English: As I mentioned in the Dexter Industries forums regarding stacking, 17mm or 18mm posts should work fine if you are connecting directly to a Raspberry Pi, but maybe not if you are connecting to a different board. There are only two mounting holes because with all the motor and sensor ports, there's not room for four, and in the standard configuration (using the acrylic case) the mounting holes aren't even used.
Deutsch: Bitte vergib mir meine falsche Deutsch, ich bin mit Google für alles zu übersetzen.
English: Please forgive my improper German, I am using google translate for everything.

Matt

Benutzeravatar
HaWe
Administrator
Administrator
Beiträge: 5385
Registriert: 11. Jan 2006 21:01
Wohnort: ein kleiner Planet in der Nähe von Beteigeuze

Re: BrickPi3: Quick Guide (mit C/C++ & "stackable" Shields)

Beitragvon HaWe » Gestern 18:23

yes, thank you for your clarification!
(ps, the Google translation was almost 100% perfect! :) )

pps,
matt,
I appreciate very much that you successfuly have been recalling your Mindstormsforum.de password :D
Gruß,
HaWe
±·≠≈²³αβγδε∂ζλμνπξφωΔΦ≡ΠΣΨΩ∫√∀∃∈∉∧∨¬⊂⊄∩∪∅∞®
NXT NXC SCHACHROBOTER: https://www.youtube.com/watch?v=Cv-yzuebC7E

Benutzeravatar
HaWe
Administrator
Administrator
Beiträge: 5385
Registriert: 11. Jan 2006 21:01
Wohnort: ein kleiner Planet in der Nähe von Beteigeuze

Re: BrickPi3: Quick Guide (mit C/C++ & "stackable" Shields)

Beitragvon HaWe » Heute 09:46

Erster Compile-/Build-Test mit Geany:

Programm info.c in Geany geladen/geöffnet (Code siehe im TO Post)

Geany settings für compile und build:
Überhaupt keine besonderen zusätzlichen Flags nötig! 8-)

(aus Bequemlichkeitsgründen habe ich die compile-Flags aus den Build-Flags übernommen, nur mit -c statt -o)

Code: Alles auswählen

g++ -Wall -c "%e" "%f"
g++ -Wall -o "%e" "%f"
make %e.o

Ausführen:

Code: Alles auswählen

sudo "./%e"


Ab jetzt kann man ganz bequem mit Funktionstasten als short-cuts arbeiten:
F8 (compile)
F9 (build)
F5 (run)

Ergebnis: wird ohne Fehler compiliert und gelinkt, Ausführung fehlerfrei. :prima:

Tipp:
wie C/C++ Programmierer wissen, kann man (eigene) .c, .cpp, .h, .hpp etc. files in den Raspi-Ordner
/usr/local/include/
kopieren, dadurch werden sie anschließend von gcc automatisch gefunden, wenn man sie mir #include einbindet.
Im Falle von BrickPi3 betrifft das ausschließlich 2 Files, nämlich
BrickPi3.cpp
und
BrickPi.h

Sie müssen dann danach also nicht mehr immer zusätzlich im aktuellen Arbeits-Directory vorhanden sein.

update:
matt hat geschrieben:As of BrickPi3 PR #67 BrickPi3.h and BrickPi3.cpp are now installed to /usr/local/include.
Gruß,
HaWe
±·≠≈²³αβγδε∂ζλμνπξφωΔΦ≡ΠΣΨΩ∫√∀∃∈∉∧∨¬⊂⊄∩∪∅∞®
NXT NXC SCHACHROBOTER: https://www.youtube.com/watch?v=Cv-yzuebC7E

Benutzeravatar
HaWe
Administrator
Administrator
Beiträge: 5385
Registriert: 11. Jan 2006 21:01
Wohnort: ein kleiner Planet in der Nähe von Beteigeuze

Re: BrickPi3: Quick Guide (mit C/C++ & "stackable" Shields)

Beitragvon HaWe » Heute 10:42

Motoren und Sensoren anschließen:

Anm.:
Nicht unbedingt für Sensoren, aber auf jeden Fall für Motoren wird eine externe Zusatz-Spannungsquelle benötigt (ca. 8-12V).
Zusätzlich den Spannungsschalter einschalten.
Jetzt wird auch der Raspi über die Zusatzspannungsquelle und den 5V GPIO-Header Pin versorgt.
Die gelbe Blink-LED auf dem BrickPi3 gibt Aufschluss über den Batteriestatus:
schnelles Blinken (4x/s.): zu schwach, 2x/s.: gerade halbwegs ausreichend, 1x/s.: sehr gut.
Zusätzlich gibt die rote Status-LED auf dem Raspi Aufschluss darüber, ob 5V anliegen (rot an: OK, rot aus: low voltage!)


Bild
Gruß,
HaWe
±·≠≈²³αβγδε∂ζλμνπξφωΔΦ≡ΠΣΨΩ∫√∀∃∈∉∧∨¬⊂⊄∩∪∅∞®
NXT NXC SCHACHROBOTER: https://www.youtube.com/watch?v=Cv-yzuebC7E

Benutzeravatar
HaWe
Administrator
Administrator
Beiträge: 5385
Registriert: 11. Jan 2006 21:01
Wohnort: ein kleiner Planet in der Nähe von Beteigeuze

Re: BrickPi3: Quick Guide (mit C/C++ & "stackable" Shields)

Beitragvon HaWe » Heute 12:31

Example: NXT Sensor Test Programm sensors_nxt.c
Läuft! :prima:

Anm.:
Analoge Sensorwerte sind 12-bit ADC, also 0-4095 statt 10-bit ADC von 0-1023. Wenn man will, kann man sie durch 4 dividieren (oder >>2), dann hat man wieder den Genauigkeits-Bereich von Lego-Analog-Sensoren.


Code: Alles auswählen

/*
 *  https://www.dexterindustries.com/BrickPi/
 *  https://github.com/DexterInd/BrickPi3
 *
 *  Copyright (c) 2017 Dexter Industries
 *  Released under the MIT license (http://choosealicense.com/licenses/mit/).
 *  For more information, see https://github.com/DexterInd/BrickPi3/blob/master/LICENSE.md
 *
 *  This code is an example for reading the encoders of motors connected to the BrickPi3.
 *
 *  Hardware: Connect NXT sensors to the sensor ports. Color sensor to PORT_1. Ultrasonic sensor to PORT_2. Light sensor to PORT_3. Touch sensor to PORT_4 (EV3 or NXT touch sensor).
 *
 *  Results:  When you run this program, you should see the values for each sensor.
 *
 *  Example compile command:
 *    g++ -o program "sensors_nxt.c"
 *  Example run command:
 *    sudo ./program
 *
 */

#include "BrickPi3.cpp" // for BrickPi3
#include <stdio.h>      // for printf
#include <unistd.h>     // for usleep
#include <signal.h>     // for catching exit signals

BrickPi3 BP;

void exit_signal_handler(int signo);

int main(){
  signal(SIGINT, exit_signal_handler); // register the exit function for Ctrl+C
 
  BP.detect(); // Make sure that the BrickPi3 is communicating and that the firmware is compatible with the drivers.
 
  int error;
 
  BP.set_sensor_type(PORT_1, SENSOR_TYPE_NXT_COLOR_FULL);
  BP.set_sensor_type(PORT_2, SENSOR_TYPE_NXT_ULTRASONIC);
  BP.set_sensor_type(PORT_3, SENSOR_TYPE_NXT_LIGHT_ON);
  BP.set_sensor_type(PORT_4, SENSOR_TYPE_TOUCH);
 
  sensor_color_t      Color1;
  sensor_ultrasonic_t Ultrasonic2;
  sensor_light_t      Light3;
  sensor_touch_t      Touch4;
 
  while(true){
    error = 0;
   
    if(BP.get_sensor(PORT_1, &Color1)){
      error++;
    }else{
      printf("Color sensor (S1): detected %d red %4d green %4d blue %4d ambient %4d   ", Color1.color, Color1.reflected_red, Color1.reflected_green, Color1.reflected_blue, Color1.ambient);
    }
   
    if(BP.get_sensor(PORT_2, &Ultrasonic2)){
      error++;
    }else{
      printf("Ultrasonic sensor (S2): CM %5.1f Inches %5.1f   ", Ultrasonic2.cm, Ultrasonic2.inch);
    }
   
    if(BP.get_sensor(PORT_3, &Light3)){
      error++;
    }else{
      printf("Light sensor (S3): reflected %4d   ", Light3.reflected);
    }
   
    if(BP.get_sensor(PORT_4, &Touch4)){
      error++;
    }else{
      printf("Touch sensor (S4): pressed %d   ", Touch4.pressed);
    }
   
    if(error == 4){
      printf("Waiting for sensors to be configured");
    }
   
    printf("\n");
   
    usleep(20000);
  }
}

// Signal handler that will be called when Ctrl+C is pressed to stop the program
void exit_signal_handler(int signo){
  if(signo == SIGINT){
    BP.reset_all();    // Reset everything so there are no run-away motors
    exit(-2);
  }
}
Gruß,
HaWe
±·≠≈²³αβγδε∂ζλμνπξφωΔΦ≡ΠΣΨΩ∫√∀∃∈∉∧∨¬⊂⊄∩∪∅∞®
NXT NXC SCHACHROBOTER: https://www.youtube.com/watch?v=Cv-yzuebC7E

Benutzeravatar
HaWe
Administrator
Administrator
Beiträge: 5385
Registriert: 11. Jan 2006 21:01
Wohnort: ein kleiner Planet in der Nähe von Beteigeuze

Re: BrickPi3: Quick Guide (mit C/C++ & "stackable" Shields)

Beitragvon HaWe » vor 5 Minuten

Example: Motor Test Programm motors.c:
alles läuft perfekt! :prima:

Anm.:
Man muss streng darauf achten, dass die Zusatz-Batterien für die Motor-Treiber genügend Spannung liefern, sonst schaltet sie der BrickPi3 automatisch ab, mit SPI Fehler - und dann hilft nur ein Reboot mit frischen Batterien!


Code: Alles auswählen

/*
 *  https://www.dexterindustries.com/BrickPi/
 *  https://github.com/DexterInd/BrickPi3
 *
 *  Copyright (c) 2017 Dexter Industries
 *  Released under the MIT license (http://choosealicense.com/licenses/mit/).
 *  For more information, see https://github.com/DexterInd/BrickPi3/blob/master/LICENSE.md
 *
 *  This code is an example for reading the encoders of motors connected to the BrickPi3.
 *
 *  Hardware: Connect EV3 or NXT motor(s) to any of the BrickPi3 motor ports.
 *
 *  Results:  When you run this program, you should see the encoder value for each motor. By manually rotating motor A, the other motor(s) will be controlled. Motor B power will be controlled, Motor C speed will be controlled, and motor D position will be controlled.
 *
 *  Example compile command:
 *    g++ -o program "motors.c"
 *  Example run command:
 *    sudo ./program
 *
 */

#include "BrickPi3.cpp" // for BrickPi3
#include <stdio.h>      // for printf
#include <unistd.h>     // for usleep
#include <signal.h>     // for catching exit signals

BrickPi3 BP;

void exit_signal_handler(int signo);

int main(){
  signal(SIGINT, exit_signal_handler); // register the exit function for Ctrl+C
 
  BP.detect(); // Make sure that the BrickPi3 is communicating and that the firmware is compatible with the drivers.
 
  // Reset the encoders
  BP.offset_motor_encoder(PORT_A, BP.get_motor_encoder(PORT_A));
  BP.offset_motor_encoder(PORT_B, BP.get_motor_encoder(PORT_B));
  BP.offset_motor_encoder(PORT_C, BP.get_motor_encoder(PORT_C));
  BP.offset_motor_encoder(PORT_D, BP.get_motor_encoder(PORT_D));
 
  while(true){
    // Read the encoders
    int32_t EncoderA = BP.get_motor_encoder(PORT_A);
    int32_t EncoderB = BP.get_motor_encoder(PORT_B);
    int32_t EncoderC = BP.get_motor_encoder(PORT_C);
    int32_t EncoderD = BP.get_motor_encoder(PORT_D);
   
    // Use the encoder value from motor A to control motors B, C, and D
    BP.set_motor_power(PORT_B, EncoderA < 100 ? EncoderA > -100 ? EncoderA : -100 : 100);
    BP.set_motor_dps(PORT_C, EncoderA);
    BP.set_motor_position(PORT_D, EncoderA);
   
    // Display the encoder values
    printf("Encoder A: %6d  B: %6d  C: %6d  D: %6d\n", EncoderA, EncoderB, EncoderC, EncoderD);
   
    // Delay for 20ms
    usleep(20000);
  }
}

// Signal handler that will be called when Ctrl+C is pressed to stop the program
void exit_signal_handler(int signo){
  if(signo == SIGINT){
    BP.reset_all();    // Reset everything so there are no run-away motors
    exit(-2);
  }
}
Gruß,
HaWe
±·≠≈²³αβγδε∂ζλμνπξφωΔΦ≡ΠΣΨΩ∫√∀∃∈∉∧∨¬⊂⊄∩∪∅∞®
NXT NXC SCHACHROBOTER: https://www.youtube.com/watch?v=Cv-yzuebC7E


Zurück zu „allgemeine / Nicht-Lego-Robotik und Elektronik“

Wer ist online?

Mitglieder in diesem Forum: mattallen37 und 19 Gäste

Lego Mindstorms EV3, NXT und RCX Forum : Haftungsauschluss