Raspberry PI

Présentation

A l’origine le Raspberry Pi est un PC miniature destiné à fonctionner sous linux. Il est développé par la Foundation Raspberry et destiné à favoriser et encourager l’apprentissage de l’informatique et du développement en proposant sur le marché une machine simple, universelle, peu gourmande en énergie et très attractive en terme de prix !

_images/raspi.png

Mon Raspberry Pi est un model B ayant pour caractéristique

Processeur et chipset  
Processeur Broadcom BCM2835 ARM1176JZFS
Fréquence 700 MHz
Socket Intégré
Mémoire  
Type de mémoire 512 Mo
Périphériques intégrés  
Contrôleur vidéo Broadcom Videocore 4 GPU
Mémoire vidéo 512 Mo (partagée)
Connectique arrière  
Connecteurs audio 1 sortie audio (jack 3,5 mm)
USB 2.0 2
HDMI 1
RJ45 1
Lecteur de cartes mémoires 1 lecteur de cartes SD
RCA Composite Oui 1 sortie
Chassis  
Dimensions 85,6 x 54 x 17 mm
Alimentation vi port micro USB 5V / 700mA

Warning

suite à l’achat la première chose à trouver est un adaptateur USB ayant pour caractéristique de sortie 5V / 700mA ... un 5V / 1A fonctionne très bien

Installation

Le Raspberry boot sur une carte SD de 4Go minimum pour le système raspbian. Le plus simple pour installer le système Raspbian est donc:

  • téléchargement de l’iso Raspbian sur http://www.raspberrypi.org/downloads
  • on décompresse le fichier zip pour obtenir un fichier img
  • utilisation de Win32diskimager (http://sourceforge.net/projects/win32diskimager/) pour installer le fichier img sur votre carte SD
  • on installe la cate sur le raspberrypi et on branche le tout
  • sur votre modem/router vous cherchez l’ip de votre rapsberry (cela sous entend que vous utilisez le serveur dhcp du routeur)
  • connexion sur le rapsberry via ssh (utilisation de putty)

sous linux la création de la carte est différente

umount /dev/sdc1
dd bs=1M if=2014-01-07-wheezy-raspbian.img of=/dev/sdc

L’utilisateur par défaut est pi et a pour mot de passe raspberry

Les premières modification à réaliser sont:

  • modification du mot de passe de root
sudo passwd root
  • lancement de l’utilitaire raspi-config
raspi-config
_images/raspi_config.png

Cet utilitaire va permettre:

  • d’utiliser pleinement la carte SD et pas uniquement 4 Go via expand_rootfs
  • overclocker votre raspberrypi overclock
  • mettre à jour le système update
  • ...

concernant l’agrandissement de la partition de la carte SD ... avant nous avons

wget http://downloads.raspberrypi.org/raspbian_latest
unzip raspbian_latest
sudo umount /dev/sdc1
sudo dd bs=1M if=raspbian_latest.img of=/dev/sdc

Warning

il est possible que sur votre système la carte CF ne soit pas mounter sur /dev/sdc il est possible que le nom de l’image change

pi@raspberrypi ~ $ df -kh Filesystem Size Used Avail Use% Mounted on rootfs 2.6G 2.0G 469M 82% / /dev/root 2.6G 2.0G 469M 82% / devtmpfs 211M 0 211M 0% /dev tmpfs 44M 228K 44M 1% /run tmpfs 5.0M 0 5.0M 0% /run/lock tmpfs 88M 0 88M 0% /run/shm /dev/mmcblk0p1 56M 19M 38M 34% /boot

après nous avons

root@raspberrypi:~# df -kh
Filesystem      Size  Used Avail Use% Mounted on
rootfs           29G  2.0G   26G   8% /
/dev/root        29G  2.0G   26G   8% /
devtmpfs        211M     0  211M   0% /dev
tmpfs            44M  228K   44M   1% /run
tmpfs           5.0M     0  5.0M   0% /run/lock
tmpfs            88M     0   88M   0% /run/shm
/dev/mmcblk0p1   56M   19M   38M  34% /boot

Note

le redimensionnement de la partition principale nécessite un reboot du raspberry

On va en profiter pour mettre via l’option “Internationalisation options” le raspberry à l’heure.

Et comme tout bon système debian nous allons vim et consoeur ...

apt-get install vim htop

et configurer notre .bashrc

vim .bashrc
export LS_OPTIONS='--color=auto'
eval "`dircolors`"
alias ls='ls $LS_OPTIONS'
alias ll='ls $LS_OPTIONS -l'
alias l='ls $LS_OPTIONS -lA'
#ADD BY FAO

# uncomment for a colored prompt, if the terminal has the capability; turned
# off by default to not distract the user: the focus in a terminal window
# should be on the output of commands, not on the prompt
force_color_prompt=yes

if [ -n "$force_color_prompt" ]; then
    if [ -x /usr/bin/tput ] && tput setaf 1 >&/dev/null; then
  # We have color support; assume it's compliant with Ecma-48
  # (ISO/IEC-6429). (Lack of such support is extremely rare, and such
  # a case would tend to support setf rather than setaf.)
  color_prompt=yes
    else
  color_prompt=
    fi
fi

if [ "$color_prompt" = yes ]; then
    PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\] \[\033[01;34m\]\w \$\[\033[00m\] '
else
    PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
fi
unset color_prompt force_color_prompt

alias vi=vim

Maintenant regardons la connexion wifi. Nous avons acheté avec le rapsberry pi un module wifi compatible.

Pour voir si la carte wifi a été reconnu et est active

root@raspberrypi:~# iwconfig
wlan0     unassociated  Nickname:"<WIFI@REALTEK>"
          Mode:Managed  Frequency=2.412 GHz  Access Point: Not-Associated
          Sensitivity:0/0
          Retry:off   RTS thr:off   Fragment thr:off
          Encryption key:off
          Power Management:off
          Link Quality:0  Signal level:0  Noise level:0
          Rx invalid nwid:0  Rx invalid crypt:0  Rx invalid frag:0
          Tx excessive retries:0  Invalid misc:0   Missed beacon:0

lo        no wireless extensions.

eth0      no wireless extensions.

Donc nous avons une carte wlan0 qui a été reconnu comme carte wifi

Visualisons les réseaux disponibles

root@raspberrypi:~# iwlist scan
wlan0     Scan completed :
          Cell 01 - Address: 0A:1D:6A:64:B5:73
                    ESSID:"orange"
                    Protocol:IEEE 802.11bgn
                    Mode:Master
                    Frequency:2.437 GHz (Channel 6)
                    Encryption key:off
                    Bit Rates:144 Mb/s
                    Quality=27/100  Signal level=62/100
          Cell 02 - Address: 00:1D:6A:64:B5:73
                    ESSID:"aoustin"
                    Protocol:IEEE 802.11bgn
                    Mode:Master
                    Frequency:2.437 GHz (Channel 6)
                    Encryption key:off
                    Bit Rates:144 Mb/s
                    Quality=48/100  Signal level=60/100

lo        Interface doesn't support scanning.

eth0      Interface doesn't support scanning.

Donc nous devrions pouvoir avoir accès au réseau aoustin

on peut faire un test rapide

root@raspberrypi:/etc/network# ifconfig wlan0 down
root@raspberrypi:/etc/network# iwconfig wlan0 essid "aoustin"
root@raspberrypi:/etc/network# ifconfig wlan0 up
root@raspberrypi:/etc/network# ifconfig wlan0
wlan0     Link encap:Ethernet  HWaddr 00:13:ef:d0:14:3f
          inet addr:192.168.1.41  Bcast:192.168.1.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:19 errors:0 dropped:25 overruns:0 frame:0
          TX packets:2 errors:0 dropped:1 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:3872 (3.7 KiB)  TX bytes:724 (724.0 B)

Nous allons maintenant pouvoir configurer notre carte réseau

cp /etc/network/interfaces /etc/network/interfaces.ini
vi /etc/network/interfaces
auto lo
iface lo inet loopback

iface eth0 inet dhcp

auto wlan0
allow-hotplug wlan0
iface wlan0 inet dhcp
    wireless-essid aoustin

dans le cas d’utilisation de clé wpa la synthaxe serait

wpa-ssid "nom du reseau"
wpa-psk "mot de passe wifi"

Utilisation

Tester la sortie son

A priori il est possible de gérer la sortie son via

raspi-config

Pour ma part par défaut le son était audible sur la sortie jack

Pour tester le son

cd /usr/share/scratch/Media/Sounds/Vocals
aplay Singer2.wav

Pour régler le volume sonore

alsamixer

Pour faire que le son soit au maximum au démarrage du raspberry

cp /var/lib/alsa/asound.state /var/lib/alsa/asound.state.ini
vi /var/lib/alsa/asound.state

puis modifier iface ayant pour nom PCM Playback Volume

iface MIXER
    name 'PCM Playback Volume'
    value 399
    comment {
        access 'read write'
        type INTEGER
        count 1
        range '-10239 - 400'
        dbmin -9999999
        dbmax 400
        dbvalue.0 399
    }

Note

on voit que la valeur maximale est 400 et on a placé 399

Pour écouter la radio rien de plus simple:

apt-get install mplayer
mplayer  http://www.tv-radio.com/station/france_inter_mp3/france_inter_mp3-32k.m3u

pour utiliser un micro (par exemple celui d’une webcam):

un lsmod avant et après la connexion de la webcam permet de voir si cette dernière est prise en charge

lsmod

si elle est prise en charge, pour enregistrer

arecord -D plughw:1,0 -f cd test.wav

Note

pour connaitre le numéro du devis (1) il faut faire un cat /proc/asound/cards

pour lire

aplay test.wav

Faisons parler le raspberry

Pour cela nous allons utiliser espeak (qui va permettre de faire du text to speech) et mbrola pour donner une voix moins métallique

apt-get install espeak

un premier test

echo "bonjour je m'appelle jarviss" | espeak -v fr

rajoutons mbrola. Actuellement mbrola n’est pas disponible pour cette version de debian. Nous allons donc télécharger l’executable ainsi que la voix d’homme French qui est lié

mkdir /usr/share/mbrola
mkdir /usr/share/mbrola/voices
wget http://tcts.fpms.ac.be/synthesis/mbrola/dba/fr1/fr1-990204.zip
unzip fr1*.zip
mv fr1/fr1 /usr/share/mbrola/voices/
wget http://www.tcts.fpms.ac.be/synthesis/mbrola/bin/raspberri_pi/mbrola.tgz
tar -xvf mbrola.tgz
mv mbrola /usr/share/mbrola
chmod 777 /usr/share/mbrola/mbrola
ln -s /usr/share/mbrola/mbrola /usr/bin/mbrola

un premier test

echo "bonjour je m'appelle jarviss" | espeak  -v mb/mb-fr1 | mbrola /usr/share/mbrola/voices/fr1

Note

On peut diminuer la vitesse de dictions en utilisant le paramètre “-s” dans espeak (valeur par défaut 160)

Note

a priori la commande espeack -v mb/mb-fr1 est largement suffisant

Problème de Boot

Comme le raspberry travaille sur une carte SD cette dernière est fragile et il peut arriver que le raspberry ne boot plus avec un message du type

UNEXPECTED INCONSISTENCY; RUN fsck MANUALLY.
   (i.e., without -a or -p options)
fsck died with exit status 4

Il faut alors ce connecter en root et lancer la commande

fsck.ext4 -cDfty -C 0 /dev/mmcblk0p2

Note

le nom du montage mmcblk0p2 peut changer il suffit de lire le message d’erreur pour avoir le bon nom

Note

si le raspberry ne démarre pas il va vous dmeander le mot de passe de root en partant du principe que vous utilisez un clavier qwerty ... syste?lx

Emulation

Il est possible d’installer différents émulateurs de jeux.

Super Nintendo NES

wget http://pisnes.googlecode.com/git/pisnes.zip
mkdir pisnes
mv pisnes.zip pisnes
cd pisnes
unzip pisnes.zip

On peu maintenant télécharger des roms et les installer dans le dossier roms en allant sur le site http://emu-fr.net/v1/module.php?page=roms_top

on peut le lancer avec

cd /home/pi/pisnes
./snes9x roms/SuperMarioWorld.smc

Nintendo NES

sudo apt-get install scons libsdl1.2-dev libsdl1.2debian subersion libgtk2.0-dev
sudo apt-get install liblua5.1
tar -xvf fceux-2.2.1.src.tar.gz #source telecharger sur le site
cd fceux-2.2.1
sudo scons GTK=1 install

On peut maintenant télécharger des roms sur http://emu-fr.net/v1/module.php?page=programme_roms&console=Nes&tri=nom&l=S

et lancer fceux avec un gamepad

fceux –inputcfg gamepad1

PiMenu

PiMenu permet d’avoir en plein écran un lanceur utilisable par gamepad

wget http://mame4all-pi.googlecode.com/git/pimenu.zip
unzip pimenu

on peut ensuite modifier le fichier pimenu.cfg et les icones BMP

Pour le lancer au démarrage graphique de l’utilisateur pi il faut modifier le fichier /home/pi/.profile

if [ -z "$BASH_VERSION" ];then
    echo && echo "Starting Pimenu" && echo
    /home/pi/pimenu/pimenu
fi

RetroPie

Il s’agit d’une image mais aussi d’un binaire permettant d’installer facilement des emulateurs A priori facile d’installation cela peut être une solution.

sudo apt-get update
sudo apt-get install -y git dialog
cd
git clone git://github.com/petrockblog/RetroPie-Setup.git
cd RetroPie-Setup
chmod +x retropie_setup.sh
sudo ./retropie_setup.sh
emulationstation

On peut aussi installer une image de RetroPie

wget http://florian.jdc.se/RetroPieImage_ver1.10.1.img.zip
unzip RetroPieImage_ver1.10.1.img.zip
umount /dev/sdc1
dd bs=1M if=RetroPieImage_ver1.10.1.img of=/dev/sdc

On peut paramétrer une manette via la commande

cd retroPie
mv confis/all/retroarch.cfg configs/all/retroarch.cfg.old
./emulators/RetroArch/installdir/bin/retroarch-joyconfig >> configs/all/retroarch.cfg

exemple de fichier retroarch.cfg

input_player1_joypad_index = "0"
input_player1_b_btn = "0"
input_player1_y_btn = "2"
input_player1_select_btn = "8"
input_player1_start_btn = "9"
input_player1_up_axis = "-5"
input_player1_down_axis = "+5"
input_player1_left_axis = "-4"
input_player1_right_axis = "+4"
input_player1_a_btn = "1"
input_player1_x_btn = "3"
input_player1_l_btn = "4"
input_player1_r_btn = "5"
input_player1_l2_btn = "6"
input_player1_r2_btn = "7"
input_player1_l3_btn = "6"
input_player1_r3_btn = "7"
input_player1_l_x_plus_btn = "6"
input_player1_l_x_minus_btn = "7"
input_player1_l_y_plus_btn = "6"
input_player1_l_y_minus_btn = "7"
input_player1_r_x_plus_btn = "6"
input_player1_r_x_minus_btn = "7"
input_player1_r_y_plus_btn = "6"
input_player1_r_y_minus_btn = "7"
input_exit_emulator_btn = 15
input_menu_toggle_btn = 16
input_player2_joypad_index = "1"
input_player2_b_btn = "0"
input_player2_y_btn = "2"
input_player2_select_btn = "8"
input_player2_start_btn = "9"
input_player2_up_axis = "-5"
input_player2_down_axis = "+5"
input_player2_left_axis = "-4"
input_player2_right_axis = "+4"
input_player2_a_btn = "1"
input_player2_x_btn = "3"
input_player2_l_btn = "4"
input_player2_r_btn = "5"
input_player2_l2_btn = "6"
input_player2_r2_btn = "7"
input_player2_l3_btn = "6"
input_player2_r3_btn = "7"
input_player2_l_x_plus_btn = "6"
input_player2_l_x_minus_btn = "7"
input_player2_l_y_plus_btn = "6"
input_player2_l_y_minus_btn = "7"
input_player2_r_x_plus_btn = "6"
input_player2_r_x_minus_btn = "7"
input_player2_r_y_plus_btn = "6"
input_player2_r_y_minus_btn = "7"
_images/Super-Famicom-Controller.jpg

Et pour télécharger les roms on va sur http://emu-fr.net/

Développement électronique

Outil

Nous pouvons utiliser pour dessiner les plans l’outil de fritzing.

apt-get install fritzing
Fritzing

Il est possible de télécharger des composant à utiliser dans fritzing comme un raspberry (https://github.com/adafruit/Fritzing-Library/tree/master/parts)

Il est aussi possible d’installer la dernière version qui possède déjà tout les éléments raspberry

apt-get install fritzing
apt-get remove fritzing
apt-get install qt4-demos qt4-designer qt4-dev-tools qt4-doc qt4-doc-html qt4-qmake qt4-qtconfig zlib1g libboost-all-dev
wget http://fritzing.org/download/0.8.7b/source-tarball/fritzing-0.8.7b.source.tar.bz2
tar -xvf fritzing-0.8.7b.source.tar.bz2
cd fritzing-0.8.7b.source
qmake
make
make install
Fritzing

GPIO

Le raspberry peut communiquer via ces ports d’entrée/sortie nommé GPIO

Cela permet de fournir du courant (3,3V ou 5V) mais aussi une masse des bus (I2C, UART, SPI) et des pins classiques

_images/raspberry-gpio.jpg

Comme nous utilisons pour les montages un T-cobbler qui ne possède pas la même notation, il existe une correspondance

  • P0 - GPIO 17
  • P1 - GPIO 18
  • P2 - R1: GPIO 21, R2: GPIO 27
  • P3 - GPIO 22
  • P4 - GPIO 23
  • P5 - GPIO 24
  • P6 - GPIO 25
  • P7 - GPIO 4
  • CE1 - GPIO 7
  • CE0 - GPIO 8
  • SCLK - GPIO 11
  • MISO - GPIO 9
  • MOSI - GPIO 10
  • RXD - GPIO 15
  • TXD - GPIO 14
  • SCL - R1: GPIO 1, R2: GPIO 3
  • SDA - R1: GPIO 0, R2: GPIO 2

Pour piloter les GPIOs via python il faut installer via pip le module RPi.GPIO

apt-get install python-pip
pip install --upgrade RPi.GPIO

Premier Montage

il va rester assez simple: nous allons allumer une led en permanence en utilisant

  • une led 5mm
  • une resistance (220 ohms)
  • une entrée 3,3V
_images/mon1.png
_images/mon1_elec.png

Warning

la led possède un “sens” d’utilisation placé à l’envers elle ne brillera pas de milles feux ...

Deuxième Montage

La différence est minime: on connecte plus le circuit sur le pin 3.3V mais sur le pin 17

_images/mon2.png
_images/mon2_elec.png

Et là il ne se passe rien ... normal il faut indiquer au pin de passer du courant et on va faire cela en python

import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM)
GPIO.setup(17, GPIO.OUT)
GPIO.output(17, GPIO.HIGH)

et là la led s’allume !!!

Le programme est assez simple:

  • il charge le module de GPIO
  • indique que nous allons travailler en mode BCM pour identifier les pins (on va utiliser son numéro)
  • indique que sur le pin 17 nous voulons envoyer une information
  • on allume le pin 17

Pour éteindre

GPIO.output(17, GPIO.LOW)

Pour ré-initialiser les pins il suffit de faire

GPIO.cleanup()

Utilisation d’un afficheur

Un afficheur 7 broches est un afficheur pour lequel chaque broche contrôle un segment. Il y a 8 segments et 1 broche pour la masse

Le schema suivant présente quelle briche contrôle quel segment

_images/digit_cc_brochage.gif

On peut donc rapidement faire un petit montage permettant au raspberry de piloter un afficheur 7 segments

_images/mon3.png
_images/mon3_elec.png

Pour résumer, le segment:

  • h est piloté par GPIO 17
  • c est piloté par GPIO 18
  • d est piloté par GPIO 27
  • e est piloté par GPIO 22
  • b est piloté par GPIO 23
  • a est piloté par GPIO 24
  • f est piloté par GPIO 25
  • g est piloté par GPIO 4

Il suffit maintenant d’écrire le programme python qui permet de contrôler cette afficheur

#! /bin/python
# -*- coding: utf-8 -*-
#
#  manage afficheur by raspberry
#
exit
__author__ = "Frederic Aoustin"
__license__ = "GPL"
__version__ = "1.0.1"
__maintainer__ = "Frederic Aoustin"
__email__ = "fraoustin@gmail.com"
__status__ = "Production"

import RPi.GPIO as GPIO
import threading
import time
PIN = [24,23,18,27,22,25,4,17]

CODING = {
    ' ' : '00000000',
    '0' : '11111100',
    '1' : '01100000',
    '2' : '11011010',
    '3' : '11110010',
    '4' : '01100110',
    '5' : '10110110',
    '6' : '10111110',
    '7' : '11100000',
    '8' : '11111110',
    '9' : '11110110',
    'E' : '10011110',
}

TRANSLATE = {
    '0' : GPIO.LOW,
    '1' : GPIO.HIGH
    }


class TestAfficheur(threading.Thread):
    def __init__(self, nom = ''):
        threading.Thread.__init__(self)
        self.Terminated = False
        self.iterateur = iter(PIN)

    def run(self):
        self.Terminated = False
        while not self.Terminated:
            try:
                pintest = self.iterateur.next()
            except:
                self.iterateur = iter(PIN)
                pintest = self.iterateur.next()
            _leds(''.join([ '1' if i== pintest else '0' for i in PIN]))
            time.sleep(1.0)

    def stop(self):
        self.Terminated = True

def _leds(code):
    for pin,v in zip(PIN, code):
        GPIO.output(pin,TRANSLATE[v])
    return True


def affiche(val):
    if val not in CODING.keys():
        return aff che('E')
    return _leds(CODING[val])

def init():
    GPIO.setmode(GPIO.BCM)
    GPIO.setwarnings(False)
    for pin in PIN:
        GPIO.setup(pin, GPIO.OUT)
    affiche(' ')

if __name__ == '__main__':
    init()
    loop = True
    test = TestAfficheur()
    while loop:
        val = raw_input("valeur a afficher")
        if val  not in ('exit','test'):
            test.stop()
            affiche(val)
        if val == 'test':
            test.start()
        if val == 'exit':
    test.stop()
            loop = False
    print('Bye')

Utilisation d’un bouton

Jusqu’à présent nous avons via le raspberry envoyé des infoformations sur les GPIOs pour échanger avec le monde réel nous allns voir comment nous pouvons faire pour recevoir des informations du monde réel via les GPIOs.

Un bouton permet simplement de faire passer ou pas du courant dans un circuit électrique. ON peut ainsi fermer un circuit. le montage suivant présente l’utilisation la plus simple d’un bouton ...

Note

le schéma est direcment connecté aux bornes + et - du raspberry

_images/monbouton1.png
_images/monbouton1_elec.png

Quand nous appuyons sur le bouton la led s’allume.

Maintenant nous allons modifier le circuit afin que l’info “led s’allume” soit communiquée au GPIO 17.

_images/monbouton2.png
_images/monbouton2_elec.png

et un petit bout de code pour voir l’action du bouton

import RPi.GPIO as GPIO
def button_on(channel):
    print("click on button")

GPIO.setmode(GPIO.BCM)
GPIO.setup(17, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.add_event_detect(17, GPIO.FALLING, callback=button_on, bouncetime=300)

et si on appuie sur le boutton plus de 300 ms

>>> click on button