Utveckling för och med Raspberry Pi



Här är det tänkt att beskriva lite olika utvecklingsprojekt. Just nu gäller det databas och C-programmering. Även programmering i Java kommer att beskrivas.
En bra editor att använda är Geany. Kommando för att installera Geany:
sudo apt-get install geany


Tillbaka till Raspberry Pi.
Inledning.
Hårdvara.
- Pinnumrering.
- wiringPi.
- pigpio.
- BCM 2835.
- GPIO.
- Färgkod för motstånd.
Skriptprogrammering.
- Grafik med skriptprogrammet dialog.
C-programmering.
- Interupt.
Webb.
Databas.
- - Problem.
- - Importera databas.
- - C-programmering mot MySQL
- - Java-programmering mot MySQL.
- - Python-programmering mot MySQL.
Java-programmering.
- REFERENS.
Assemblerprogrammering.
Grafiskt IDE, Qt.
Grafiskt IDE, gtk.
Lite pytonexempel.

 


Inledning.

Beskrivning av vad som behövs för att programmera RPi's hårdvara. Först behöver man installera programvara för att styra BCM2835. Dessutom bör man installera programpaketet wiringPi.

Lämplig mjukvara för utveckling:

Geany - ett grafiskt utvecklingsverktyg.
wiringPi - för att bland annat kunna skriva program i C.
pigpio - C bibliotek för Raspberry P.
gftp - grafiskt ftpprogram för filöverföring.
Beroende på vad man håller på med kan följande program behöva installeras:
bcm2835-version.tar.gz - C bibliotek för Raspberry Pi.
piface - program för att utveckla program för PiFace.
pi4j - verktyg för att skriva javaprogram.
Arduino - utvecklingsmiljö för Arduino.
tightvncserver - möjlighet att presentera RPi:s skrivbord i en PC.

 


Till början.


Hårdvara.


Montering och koppling av diverse hårdvara till Raspberry Pi.

Max belastning av GPIO-pinne.
Enligt en artikel i Linux User & Developer, fritt översatt:
Med 3V3 spåret så är saker inte riktigt klart. det som gäller är att max belastning för alla pinnarna tillsammans är 50mA. Det finns en maximal belastning per pinne på 12-15mA. (siffrorna är inte helt säkra så var försiktig med testning). För att var på den säkra sidan så fördela de 50mA på 3 till fyra pinnar.



wiringPi


wiringPi har flyttats till en egen sida: wiringPi.



pigpio


pigpio är ett C-bibliotek för Raspberry Pi som tillåter kontrol av "general purpose input outputs (gpio).
pigpio fungerar på alla versioner av Raspberry Pi (Pi A, Pi B, Pi A+, Pi B+, Pi2B, Compute Module, Pi Zero)

Installation.
wget abyz.co.uk/rpi/pigpio/pigpio.zip
unzip pigpio.zip
cd PIGPIO
make
sudo make install

Testning.
sudo ./x_pigpio # check C I/F
sudo pigpiod     # start daemon
./x_pigpiod_if2 # check C I/F to daemon

Efter installation och testning starta om Raspberry Pi Zero:
sudo reboot.

GPIO

ALLA GPIO identifieras genom sina Broadcom nummer. Se elinux.org
Det finns totalt 54 gpio, arrangerade i två bankar.

Bank 1 innehåller gpio 0-31. Bank 2 innehåller gpio 32-54.
En användare ska bara använda gpio i bank 1.

Instruktioner på engelska. The pigpio library



Till början.



BCM2835


Här är ett exempel på ett program i C som läser status på en inport.
Programmet använder C library for Broadcom BCM 2835 as used in Raspberry Pi. Det kan laddas ner här:
http://www.airspayce.com/mikem/bcm2835/bcm2835-1.49.tar.gz
Instruktioner för installation finns här:
http://www.airspayce.com/mikem/bcm2835/

* tar zxvf bcm2835-1.xx.tar.gz
* cd bcm2835-1.xx
* ./configure
* make
* sudo make check
* sudo make install
*


// readPin9-2.c
//
// Example program for bcm2835 library
// Blinks a pin on an off every 0.5 secs
//
// After installing bcm2835, you can build this
// with something like:
// gcc -o readPin9-2 -l rt readPin9-2.c -l bcm2835
// sudo ./readPin9-2
//
// Or you can test it before installing with:
// gcc -o readPin9-2 -l rt -I ../../src ../../src/bcm2835.c readPin9-2.c
// sudo ./readPin9-2
//
// Author: Mike McCauley (mikem@open.com.au)
// Copyright (C) 2011 Mike McCauley
// $Id: RF22.h,v 1.21 2012/05/30 01:51:25 mikem Exp $

#include "bcm2835.h"

// Reads from RPi pin GPIO 9
#define PIN RPI_GPIO_P1_21

int main(int argc, char **argv)
      {
      int value;
     // If you call this, it will not actually access the GPIO
     // Use for testing
     // bcm2835_set_debug(1);

     if (!bcm2835_init())
           return 1;

     // Set the pin to be an input
     bcm2835_gpio_fsel(PIN, BCM2835_GPIO_FSEL_INPT);

     // Read
     while (1)
           {
     // Read it
           value=bcm2835_gpio_lev(PIN);
           printf("%s %d\n","Pin 9 = ",value);

     // wait a bit
           delay(1500);
      }

     return 0;
}

Här finns mer information om BCM2835.


Till början.


Hårdvaruprogrammering.


Numrering av stiften på Raspberry Pis kontakt P1.
Benämning av stiftnummer kan göra en riktigt konfys, den varierar beroende på vad man refererar till. Själva Raspberry Pi har en numrering. Programpaketet wiringPi har en annan numrering. Processorn BCM2835 har en tredje numrering. Bara för att krångla till det lite till så skiljer sig numreringen mellan Raspberry Pi ver 1 och Rasperry Pi ver 2 åt lite grand. Så det gäller att se upp när man ska koppla in utrustning på Raspberry Pi.
Nedanstående tabell är ett försök att bereda ordning i denna oordning.






Inkoppling av LED och brytare.



Här finns information och exempel på hur man programmera GPIO-interfacet:
Connecting Java to the Raspberry Pi http://pi4j.com/example/control.html


Färgkod för motstånd.





Till början.


Skriptprogrammering.



 

Här är ett skript som tänder en lysdiod väntar en sekund och släcker den första lysdioden och tänder nästa lysdiod. Detta görs i tur och ordning för fyra lysdioder. Detta upprepas 5 gånger.


#!/bin/sh
PORT1=7
PORT2=18
PORT3=23
PORT4=24
LOOP=5

gpio -g mode $PORT1 out
gpio -g mode $PORT2 out
gpio -g mode $PORT3 out
gpio -g mode $PORT4 out
N=5
for i in 1 2 3 4 5
do
echo $i
gpio -g write $PORT1 1
sleep 1
gpio -g write $PORT1 0
gpio -g write $PORT2 1
sleep 1
gpio -g write $PORT2 0
gpio -g write $PORT3 1
sleep 1
gpio -g write $PORT3 0
gpio -g write $PORT4 1
sleep 1
gpio -g write $PORT4 0
done


Här är ett skript som känner av om en knapp trykts ner. När knappen tryckts ner så avslutas programmet.


#!/bin/sh

INPORT=8
gpio -g mode $INPORT in
echo "Start"
gpio -g read $INPORT
for i in 1 2 3 4 5 6 7 8 9
do
RESULT=$(gpio -g read $INPORT)
echo "RESULT= " $RESULT
sleep 1
if [ $RESULT -ne 0 ] ; then
echo "Avbutet"
exit
fi
done
echo "Slut"


 

Grafik med skriptprogrammet dialog.


Installera programmet dialog:
sudo apt-get install dialog


Ett enkelt grafiskt menyprogram:
val.sh



Starta programmet i ett terminalfönster med:
val.sh


Resultat:



Till början.



C-programmering..


Se här.



Till början.



Webbprogrammering.


Installera apache2 (sudo apt-get install apache2).
Installera php-html-common för webserver (sudo apt-get install php-html-common).

Kopiera filer från en befintlig hemsida eller skapa en ny hemsida från början. Filer och mappar ska placeras i /var/www/hemsidenamn
Anropet till hemsidan sker sedan med IP-address/hemsidenamn.

Styra Raspberry Pi från en hemsida.


Börja med att skapa rätt behörighet för mappen /var/www: sudo chown -R www-data:www-data /var/www. Fortsätt med att skapa användaren www-data genom att lägga in en rad i visudo: sudo visudo
Lägg till detta i slutet på filen:
www-data ALL=NOPASSWD: ALL
Skapa en ny mapp, t ex remote, inne i mappen /var/www/html
Nu är det dax att skapa filen gpio.php:

Sedan anropas filen från en webbläsare med URL http://10.0.0.47/remote/gpio.php
I prgrammet används GPIO-nummer enligt BCM2835.

Länk till ytterligare information: http://www.raspberry-pi-geek.com/Archive/2014/07/PHP-on-Raspberry-Pi



Till början.



Databas.


Installera MySQL.
Börja med att uppdatera paketförråden, kommando:
sudo apt-get update
sudo apt-get install mysql-common
sudo apt-get install mysql-client
(sudo apt-get install libdbd-mysql-perl)
sudo apt-get install libmysqlclient-dev
sudo apt-get install mysql-server

Från och med Raspbian Strech (2017-08-16) ska man välja att installera MariaDB i stället.
sudo apt-get install mariadb-common
sudo apt-get install mariadb-client
sudo apt-get install libmariadbd-dev
sudo apt-get install libmysqlclient-dev
sudo apt-get install mariadb-server


I samband med installationen av mysql-server frågas efter lösenordet för root.

När detta är klart så starta mysql i ett terminalfönster med kommando mysql
Testa hur det blev show databases; (glöm inte semicolon i slutet.)
För att lämna mysql skriv exit .

Du kan även installera det grafiska gränssnittet phpMyAdmin
sudo apt-get install phpmyadmin
Därefter behövs länkning:
sudo ln -s /usr/share/phpmyadmin /var/www/phpmyadmin
Programmet tar mycket kraft ur datorn så det blir ganska segt att använda.
Däremot blir svarstiderna acceptabla om man anropar phpmyadmin från en annan dator. Då går det inte åt så mycket kraft för att hantera grafiken. Anropet sker med IP-adress/phpmyadmin.
Det går även att från ett terminalfönster i en annan dator starta Midori (webbläsare) och i adressfältet skriva localhost/phpmyadmin.


Problem.


Ett fel som kan uppstå yttrat sig med följande meddelande:

table 'phpmyadmin.pma_table_uiprefs' doesn't exist


Detta kan åtgärdas genom att omkonfigurera phpmyadmin.
sudo dpkg-reconfigure phpmyadmin
Svara på de frågor som kommer upp med uppgifter som gäller dig. Dock är det viktigt att svara unix-uttag på frågan om anslutningsmetod.


Skapa en användare.


mysql> grant usage on * to pi@localhost identified by 'pi';

Query OK, 0 rows affected (0.00 sec)


Skapa lösenord för användaren bison.

mysql> set password for pi@localhost=password('raspberry');

Query OK, 0 rows affected (0.00 sec)


Skapa behörighet till en databasen bison för användaren bison.

mysql> grant all on bison.* to pi;


Skapa en databas.


Börja med att logga i som root.
pi@raspberrypi ~ $ mysql -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 39
Server version: 5.5.24-9 (Debian)

Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

Skapa databasen med följande kommando:

mysql> CREATE DATABASE `bison` DEFAULT CHARACTER SET utf8 COLLATE utf8_swedish_ci;

Query OK, 1 row affected (0.00 sec)

Kontrollera vad som hänt med kommando:
mysql> show databases;

Då får du följande resultat
+--------------------+
| Database             |
+--------------------+
| information_schema |
| bison                  |
| mysql                 |
| performance_schema |
| test                     |
+--------------------+
5 rows in set (0.01 sec)

mysql>

För att fortsätta och använda databasen bison skriv:
mysql> USE `bison`;
Database changed
mysql>

För att skapa en tabell:

mysql> CREATE TABLE IF NOT EXISTS `bilder` (
-> `bildnr` int(11) NOT NULL,
-> `emne` varchar(100) COLLATE utf8_swedish_ci DEFAULT NULL,
-> `beskrivning` text COLLATE utf8_swedish_ci,
-> `path` varchar(250) CHARACTER SET utf8 COLLATE utf8_unicode_ci DEFAULT NULL,
-> PRIMARY KEY (`bildnr`)
-> ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_swedish_ci;

Query OK, 0 rows affected (0.05 sec)

mysql>
Se resultatet
mysql> show tables;
+-----------------+
| Tables_in_bison |
+-----------------+
| bilder               |
+-----------------+
1 row in set (0.01 sec)

mysql>

Skapa sedan minst en post i tabellen bilder.

INSERT INTO `bilder` (`bildnr`, `emne`, `beskrivning`, `path`) VALUES
(1, 'Semester, 2012 Ibiza grisfest', '/home/pelle/Bilder/grisfest.jpg');


För att lära sig MySQL se dess hemsida: http://dev.mysql.com/doc/refman/5.6/en/index.html


Importering av en databas.


Kommando för att importera en databas:
mysql -u root -p < filnamn.sql

För att kopiera en databas kan följande kommando användas:
mysqldump --opt -u root -p password databasnamn > databasnamn.sql

För att kopiera en databas på en annan dator.
Först behöver filen /etc/mysql/my.cnf redigeras, ändra till:
bind-address = 0.0.0.0
ELLER
#bind-address = 127.0.0.1

Därefter är kommandot:
mysqldump --opt -h 'IP-adress' -u 'namn' --password='lösenord' 'databasnamn' > /home/jan/temp/backuper/filnamn.sql



Till början.


C-programmering mot MySQL.



För att kunna skriva C-program mot MySQL behöver paketet libmysqlclient-dev installeras.
sudo apt-get install libmysqlclient-dev


API (Application Programming Interface) för C-program finns att studera på MySQLs hemsida:
http://dev.mysql.com/doc/refman/5.5/en/dynindex-cfunction.html


Exempel på ett C-program för att arbeta mot den ovanstående databasen:


#include <stdio.h>
#include <stdlib.h>
#include </usr/include/mysql/mysql.h>

int main(int argc, char **argv)
{

  MYSQL *conn;
  MYSQL_RES *result;
  MYSQL_ROW row;
  int num_fields;
  int i;

  conn = mysql_init(NULL);
  mysql_real_connect(conn, "localhost", "bison", "bison", "bison", 0, NULL, 0);

  mysql_query(conn, "SELECT * FROM bilder");
  result = mysql_store_result(conn);

  num_fields = mysql_num_fields(result);

  while ((row = mysql_fetch_row(result)))
  {
    for(i = 0; i < num_fields; i++)
    {
      printf("%s ", row[i] ? row[i] : "NULL");
    }
  printf("\n");
  }

  mysql_free_result(result);
  mysql_close(conn);

}


Spara programmet med till exempel namnet bild-db.c

Kompilera programet med följande kommando:
gcc bild-db.c -L/lib/mysql -L/usr/lib -lmysqlclient -o bild-db

Det exekverbara programmet kommer att hete bild-db



Här är ett annat exempel på ett C-program mot MySQL.



 

/* Enkelt C program som ansluter till en MySQL Databas server*/
#include </usr/include/mysql/mysql.h>
#include <stdio.h>
main() {
     MYSQL *conn;
     MYSQL_RES *res;
     MYSQL_ROW row;
     char *server = "localhost";
     char *user = "root";
     char *password = "password"; /* sätt lösenordet för root först. Ange detta här. */
     char *database = "mysql";
     conn = mysql_init(NULL);
     /* Anslut till databas */
     if (!mysql_real_connect(conn, server,
         user, password, database, 0, NULL, 0)) {
         fprintf(stderr, "%s\n", mysql_error(conn));
         exit(1);
     }
     /* skicka en SQLfråga */
     if (mysql_query(conn, "show tables")) {
         fprintf(stderr, "%s\n", mysql_error(conn));
         exit(1);
     }
     res = mysql_use_result(conn);
     /* skriv ut tabellnamn */
     printf("MySQL tabeller i mysql databas:\n");
     while ((row = mysql_fetch_row(res)) != NULL)
         printf("%s \n", row[0]);
     /* Stäng anslutningen */
     mysql_free_result(res);
     mysql_close(conn);
}


 

Spara programmet med namnet enkel-db-connect.c

Kopilering sker med kommando:
gcc enkel-db-connect.c -L/lib/mysql -L/usr/lib -lmysqlclient -o enkel-db-connect

Kör det kompilerade programmet med kommando: ./enkel-db-connect



Till början.



Javaprogrammering mot MySQL.


Börja med att installera följande paket:
(openjdk-7-jre)
openjdk-7-jdk
Kommando:
(sudo apt-get install openjdk-7-jre) installeras troligen när man installerar openjdk-7.
sudo apt-get install openjdk-7-jdk

För att kunna göra anrop mot en MySQLdatabas så måste ett program hämtas från Oracle:
http://www.mysql.com/products/connector/
JDBC Driver for MySQL (Connector/J)
Den nerladdade filen packas upp med kommando:
tar xf mysql-connector-java-5.1.22.tar.gz
Därefter ska CLASSPATH sättas, exempel:
export CLASSPATH=/home/pi/mysql-conn/mysql-connector-java-5.1.22-bin.jar:$CLASSPATH

När det är gjort så går det utmärkt att kompilera och köra javaprogram som anropar en MySQLdatabas.

Ett exempel:


 


Programmet kompileras med kommando:
javac programnamn.java
Då skapas filen programnamn.class
Sedan körs programmet med kommando:
java programnamn
OBS! Utelämna ordet class nör programmet körs.

En .jarfil startas med kommandot:
java -jar program.jar


Till början.



Pythonprogrammering mot MySQL.


Börja med att installera följande paket:
sudo apt-get install python-mysqldb
Lägg till följande i början på programmet:
import MySQLdb
När det är gjort så går det utmärkt att köra pytonprogram som anropar en MySQLdatabas.

När man väl kommit in i hur man accessar en MySQL-databas med Python upptäcker man att det hela mest handlar om att formulera SQL-kommandon samt att hålla tungan rätt i mun och stava rätt. Ibland kan det vara användbart att lägga in en printsats efter db.rollback() för att se om sqlsatsen fungerat OK.

Nedan exempel med Sense HAT:


 

Exempel på hur man skapar(create) en tabell.


Programmet körs med kommando:
python create_data.py


Exempel på hur man skriver(insert) in data i en tabell.


Programmet körs med kommando:
python insert_data.py

Resultat:


Till början.



Javaprogrammering.


Installation av Pi4j.

Börja med att installera openjdk och wiringPi.

sudo apt-get install openjdk-7-jdk

sudo apt-get install git-core
git clone git://git.drogon.net/wiringPi
git pull origin
cd wiringPi
./build

Nu är det dags att installera Pi4j som finns här. Installationen sker med kommandot:
curl -s get.pi4j.com | sudo bash
Pi4j kommer att installeras i /opt/pi4j

Classer mm.

Information om paket, klasser och metoder.

Numrering av pinnarna vid användning av Pi4j.


I detta exempel används PiFace Digital I/O 2.
Programexempel - PiFaceExample.java :


Kompilering:
   javac -classpath .:classes:/opt/pi4j/lib/'*' -d . PiFaceExample.java

Exekvering:
I samma directory som PiFaceExample ligger:
   sudo java -classpath .:classes:/opt/pi4j/lib/'*' PiFaceExample
Från annat directory:
sudo java -cp /opt/pi4j/examples:classes:/opt/pi4j/lib/'*' PiFaceExample


I detta exempel används Pi-LITEr som har sina LEDs kopplade direkt till pinnarna på Raspberry Pi.
GpioExamples_4.java:


I detta exempel används endast en LED (pin 29) och en knapp (pin 21).
Ifall man trycker på knappen inom 2 sek och håller den intryckt så tänds lysdioden.
GpioExample_5_c.java:


I detta exempel, Exec.java, anropas ett program inifrån ett javaprogram.


I denna rad:
Process p = Runtime.getRuntime().exec("/home/pi/Development/Cprog/pi-liter-test_2");
får man ange program och sökväg till det externa program man valt.



REFERENS.
Pi4J Projekt: http://pi4j.com/install.html
Klasser: http://pi4j.com/apidocs/index.html



Till början.



Grafiskt IDE, Qt.


Qt är ett IDE för att utveckla grafiskt för i första hand C++.
Projektets hemsida: http://qt-project.org/doc/qt-4.8/

Installation sker på följande sätt:
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install qt4-designer qt4-linguist-tools qtcreator

Starta programmen:
1. I det grafiska skrivbordet:
    Välj Menu - Programmering - önskat program.
2. I terminalfönster:
    Skriv: creator &
    eller: qtdesigner &



Grafiskt IDE, gtk.


gtk är ett IDE för att utveckla grafiskt för i första hand C++.
Projektets hemsida: https://developer.gnome.org/
Sida för att lära sig (tutorial): https://developer.gnome.org/gtk-tutorial/stable/c39.html#SEC-HELLOWORLD

Installation sker på följande sätt:
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install gnunet-gtk-dev

Länkar till tutorial:
GTK+ 2.0 Tutorial.
Hello World in GTK
Handbok för Gränssnittsbyggaren Glade

Programexempel.

	

Här är ett exempel där man via ett grafiskt gränssnitt tänder och släcker lysdioder. I detta exempel användar man Ciseco PiLITEr med 8 lysdioder varav 2 stycken används i exemplet.


Resultat.



Till början.



Lite pythonexempel.


Först en liten upplysning:
Ibland när man ska köra/exekvera ett pythonprogram kan det vara nödvändigt att köra det som root, till exempel:
sudo python gui_sliderRGB.py

Här är några grundläggande exempel på program i Python. Exemplet är hämtat från magasinet The MagPi.
Exemplen bygger på följande uppkoppling:


R1 = 470 ohm
R2 = 1kohm
R3 = 10kohm

Exempel nr 1, ledtest.py:

#!/usr/bin/python
import time
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BOARD)
GPIO.setup(18, GPIO.OUT)

GPIO.output(18,False)
time.sleep(3)
GPIO.output(18,True)							
							

Exekvering görs med kommando:
sudo python ./ledtest.py


Exempel nr 2, pushbutton.py:

#!/usr/bin/python
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BOARD)
GPIO.setup(17, GPIO.IN)
GPIO.setup(18, GPIO.OUT)

while True:
	if GPIO.input(11):
		GPIO.output(12,True)
	else:
		GPIO.output(12,False)							
							

Exekvering görs med kommando:
sudo python ./pushbutton.py


Exempel nr 3, random_number.py:

#!/usr/bin/python
import RPi.GPIO as GPIO
import time
import random
GPIO.setmode(GPIO.BOARD)
GPIO.setup(17, GPIO.IN)
GPIO.setup(18, GPIO.OUT)

while True:
	if not GPIO.input(17):
		flash = random.randint(1,6)
		while not GPIO.input(17):
			GPIO.output(18, True)
		while flash > 0:
			GPIO.output(18, False)
			time.sleep(.5)
			GPIO.output(18, True)
			time.sleep(.5)
			flash ­= 1
	else:
		GPIO.output(18,True)							
							

Exekvering görs med kommando:
sudo python ./random_number.py


Ett programexempel för Sense HAT.



Till början.