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 ! .. figure:: data/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 .. code-block:: bash 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 .. code-block:: bash sudo passwd root * lancement de l'utilitaire raspi-config .. code-block:: bash raspi-config .. figure:: data/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 .. code-block:: bash 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 .. code-block:: bash 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 ... .. code-block:: bash apt-get install vim htop et configurer notre .bashrc .. code-block:: bash vim .bashrc .. code-block:: bash 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 .. code-block:: bash root@raspberrypi:~# iwconfig wlan0 unassociated Nickname:"" 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 .. code-block:: bash 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 .. code-block:: bash 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 .. code-block:: bash cp /etc/network/interfaces /etc/network/interfaces.ini vi /etc/network/interfaces .. code-block:: bash 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 .. code-block:: bash 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 .. code-block:: bash raspi-config Pour ma part par défaut le son était audible sur la sortie jack Pour tester le son .. code-block:: bash cd /usr/share/scratch/Media/Sounds/Vocals aplay Singer2.wav Pour régler le volume sonore .. code-block:: bash alsamixer Pour faire que le son soit au maximum au démarrage du raspberry .. code-block:: bash 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 .. code-block:: bash 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: .. code-block:: bash 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 .. code-block:: bash lsmod si elle est prise en charge, pour enregistrer .. code-block:: bash 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 .. code-block:: bash 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 .. code-block:: bash apt-get install espeak un premier test .. code-block:: bash 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é .. code-block:: bash 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 .. code-block:: bash 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 .. code-block:: bash 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 ------------------ .. code-block:: bash 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 .. code-block:: bash cd /home/pi/pisnes ./snes9x roms/SuperMarioWorld.smc Nintendo NES ------------ .. code-block:: bash 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 .. code-block:: bash 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 PiMenu ------ PiMenu permet d'avoir en plein écran un lanceur utilisable par gamepad .. code-block:: bash 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 .. code-block:: bash 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. .. code-block:: bash 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 .. code-block:: bash emulationstation On peut aussi installer une image de RetroPie .. code-block:: bash 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 .. code-block:: bash 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 .. code-block:: bash 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" .. figure:: data/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**. .. code-block:: bash 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 .. code-block:: bash 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 .. figure:: data/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 .. code-block:: bash 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 .. figure:: data/mon1.png .. figure:: data/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 .. figure:: data/mon2.png .. figure:: data/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 .. code-block:: 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 .. code-block:: python GPIO.output(17, GPIO.LOW) Pour ré-initialiser les pins il suffit de faire .. code-block:: python 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 .. figure:: data/digit_cc_brochage.gif On peut donc rapidement faire un petit montage permettant au raspberry de piloter un afficheur 7 segments .. figure:: data/mon3.png .. figure:: data/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 .. code-block:: python #! /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 .. figure:: data/monbouton1.png .. figure:: data/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. .. figure:: data/monbouton2.png .. figure:: data/monbouton2_elec.png et un petit bout de code pour voir l'action du bouton .. code-block:: python 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