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 !
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
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
Note
On peut aussi télécharger des roms sur http://www.generation-linux.fr/index.php?post/2008/11/27/Un-emulateur-Nintendo-NES-sous-Linux-%3A-Fceu/Gfceu
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"
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
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
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
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
On peut donc rapidement faire un petit montage permettant au raspberry de piloter un afficheur 7 segments
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
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.
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