La carte Orange PI PC plus

orangepipcplus.jpg, fév. 2021

Cette carte a cela de bien par rapport à une raspberry qu'elle permet pour 25 euros de disposer d'un système assez performant avec pas mal d'entrées sorties :

  • Processeur H3 4 cœurs jusqu'à 1.37 Ghz
  • 1 go de ram
  • 3 ports USB 2 standard + un port micro OSB OTG
  • Alimentation sur connecteur spécifique 3mm (plus de micro USB!)
  • Port HDMI sur connecteur standard
  • Sortie audio et vidéo composite intégrée sur un jack 3.5mm
  • Port Ethernet intégré
  • Interface Wifi intégrée, avec antenne externe, et possibilité d'adapter des antennes à fort gain grâce au connecteur d'antenne standard.
  • Micro intégré sur la carte mère
  • Bouton intégré permettant de faire un shutdown "propre" avant de débrancher
  • Récepteur infrarouge intégré
  • Interface caméra (spécifique à Orange Pi)
  • Connecteur d'entrées sorties à 40 broches largement compatible avec celui d'une Raspberry PI
  • Interface pour UART TTL intégrée (pour debug de la carte) sur connecteur 3 broches dédié
  • Socket pour mettre des cartes TF (carte miro SD)

Mais surtout, son principal atout réside dans le fait qu'elle intègre 8 Go de mémoire eMMC (c'est le "plus" dans la référence Orange Pi PC) sur laquelle nous pourrons mettre notre système d'exploitation. Outre le fait que cela soit bien plus fiable que la classique carte SD, c'est aussi beaucoup plus rapide. La carte SD reste disponible par exemple pour booter sur un autre OS, ou pour tester d'autre configurations sans altérer la mémoire interne eMMC.

Installation du système d'exploitation

Préparation de l'image

J'attire votre attention sur le choix de la carte SD qui est crucial. Il faut une carte rapide (Classe A1 ou A2), de marque (Sandisk!) et méfiez vous des contrefaçon qui sont légion sur Aliexpress... Tout autre choix prendra au minimum un temps infini(carte peu performante), voir ne marchera carrément pas (carte avec des erreurs de lecture / écriture). Bien souvent si ce n'est pas stable, lent ou que le processus d'installation ne fonctionne pas comme il devrait, c'est la faute de la carte SD!

Nous allons ici nous baser sur la distribution Armbian ( https://www.armbian.com/ ), ou Debian pour ARM, qui est plutôt bien supportée, et motorise un grand nombre de carte chinoises à base de processeurs divers dont notre H3. La carte Orange Pi PC plus y est bien supportée (voir https://www.armbian.com/orange-pi-pc-plus/ ) que ce soit sous Focal (debian 11) ou Buster (Debian 10). Nous allons prendre une Buster pour l'installation.

Après avoir téléchargé l'image 'Desktop' ( https://redirect.armbian.com/region/EU/orangepipcplus/Buster_current_desktop ), l'avoir décompressée avec 7Zip , il va nous falloir se munir d'une carte SD de 8 Go mini, d'un logiciel pour écrire cette image sur la carte SD ( Armbian recommande https://gitlab.com/bztsrc/usbimager/ ). Le process est décrit dans la doc ( https://docs.armbian.com/User-Guide_Getting-Started/#how-to-prepare-a-sd-card ) et ne devrait pas vous poser de problème.

First boot

Après avoir inséré la carte SD fraichement installée, raccordé un écran et un clavier souris USB, et éventuellement un câble réseau, il est temps d'allumer la carte.

Au premier démarrage, la carte déroule le boot linux, puis affiche un message disant qu'elle est en train d'agrandir le file system pour utiliser toute la carte SD. La laisser faire. Elle va rebooter toute seule à l'issue.

Lors du second boot, plusieurs questions vont vous être posées :

  • mot de passe pour le compte root. Attention, car à ce stade, vous avez un clavier Querty.... Donc choisir un mot de passe assez simple et idéalement n’utilisant pas les lettre M, A, Q qui ne sont pas à la même place en querty et en azerty.
  • vous souhaiter utiliser bash (choix 1) ou zsh (choix 2). J'ai choisi bash, mais c'est une affaire de convenance...
  • donner le nom d'un compte utilisateur à créer. Il n'est en effet pas bon de travailler en root. Ce sera votre compte de travail.
  • Le mot de passe du compte à créer (même remarque que pour le compte root!!!)
  • Le nom réel de l'utilisateur

La création du compte et les opérations qui s'ensuivent prennent plusieurs dizaines de secondes. Le système démarre ensuite dans l'environnement graphique.

Paramétrage wifi

Si vous avez branché un câble réseau, cette étape n'est probablement pas nécessaire.

Pour mémo et comme sur n'importe quelle distribution linux, il est passible de disposer de plusieurs consoles virtuelles. CTRL + ALT + F1 à F6 sont des consoles texte, tandis que CTRL + ALT + F7 revient dans l'environnement graphique.

Dans l'environnement graphique, en haut à droite, cliquez sur l'icone WIfi, choisissez le réseau auquel vous voulez vous connecter et introduisez le mot de passe. Attention, le clavier à ce stade est encore en Querty.. Une fois la connexion établie, le système devrait vous l'indiquer dans la zone wifi avec un splendide "connection established".

Configuration

Dans le menu Applications, lancer un "Terminal Emulator". Attention tout ce que vous aller taper à ce stade est encore via le clavier Querty... Avec la commande "ip a" vous pouvez vérifier votre adresse ip.

Lancez ensuite la commande "sudo armbian-config". Les touches fleches nous permettront de changer de menu (ou page up page down pour aller plus vite), espace pour activer une case à cocher, tabulation pour changer de champ, escape pour annuler et entrée pour valider.

  • "Personal" >"Timezone" >"Europe" > "Paris"
  • "Personal" >"locales" et choisir "fr_FR.UTF8 UTF8" puis faire suivant et choisir fr_FR.UTF8 comme langue par défaut. Cela prend un peu de temps.
  • "Personal" >"Keyboard" > "Generic 105 Keys PC Intl" >"Autre" > "French" > "French" > "Disposition par défaut pour le clavier" > "Pas de touche compose" > "Faut il utiliser control + alt + backspace pour arrêter le serveur X" > "Oui .
  • "Personal" >"Hostname" > puiss indiquez le nom que vous voulez donner à votre carte (ex : debian10)
  • "System" > "CPU" > Min speed =480mHz, Max Speed = 1368mHz, profil "Performance"
  • "System" > "Avahi"
  • "System" > "Hardware" puis activer avec la barre d'espace "I2C0","Uart3". Vous pouvez également ajouter "Analog Codec" si vous désirez utiliser la sortie audio sur le Jack 3.5mm. Ce sera via l'HDMI sinon. Ne pas accepter le reboot, nous rebooterons une fois l'ensemble terminé.
  • "System" > "SSH" puis "Save". Dans un premier temps, vous pouvez laisser "permit root login" (à désactiver plus tard pour des raisons de sécu) et "Password Authentication" (à désactiver plus tard quand vous aurez mise une clé).
  • "System" > "Firmware" (ceci va faire les mises à jour). Cette opération prend du temps.. (30 minutes à 1 heure)

A l'issue, l'updater va demander de redémarrer. Accepter.

Après redémarrage, vous allez arriver sur un écran de login, avec le nom d'utilisateur pré rempli sur le compte que vous avez créé à l'étape précédente. Plus qu'à mettre le mot de passe associé pour se logger. A noter qu'à ce stade, nous avons un clavier en français, une connexion réseau, un système à jour, et la possibilité de se connecter en SSH.

Pour en connaitre l'adresse ip, il suffit de taper la commande "ip a" dans un terminal:

jpcivade@debian10:~$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc mq state DOWN group default qlen 1000
    link/ether 02:81:35:b7:24:b0 brd ff:ff:ff:ff:ff:ff
3: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 12:81:35:b7:24:b0 brd ff:ff:ff:ff:ff:ff
    inet 192.168.20.127/24 brd 192.168.20.255 scope global dynamic noprefixroute wlan0
       valid_lft 39844sec preferred_lft 39844sec
    inet6 fe80::7848:fe3b:e11c:ca5e/64 scope link noprefixroute
       valid_lft forever preferred_lft forever

Ici, étant en WIfi, c'est l'interface WLAN0 qui porte le réseau, en 192.168.20.127. Si vous êtes connecté en internet filaire, ce sera sur l'interface "ETH0".

Nous allons relancer "sudo armbian-config" d'un terminal afin de désactiver le lancement automatique de l'environnement graphique:

  • "System" >"Desktop" > "Stop"

Cette configuration sera activée immédiatement. L'objectif est d'éviter de consommer la mémoire nécessaire pour le lancement systématique d'un environnement graphique . L'environnement graphique est arrêté, et un petit bug vous laisse sur un écran noir... Pas de soucis, repasser sur une console (avec CTRL + ALT + F1), et loggez vous avec votre compte utilisateur...

Installation des compléments

Nous allons maintenant installer le compilateur C, xrdp et ses dépendances (pour jouer avec l'interface graphique directement avec le bureau à distance de windows) et quelques utilitaires (screen neofetch, etc..) C'est un petit peu long ca il y a un peu de dépendances (15 minutes)

sudo apt -y install xrdp xorgxrdp neofetch libavahi-compat-libdnssd-dev python-pip python3-pip mc i2c-tools python-smbus python-psutil  python-dev iftop telnet ncftp

A ce stade, nous avons la possibilité de nous connecter à notre système :

  • Localement, via la console texte, sur écran/Clavier/souris connecté au système
  • Localement en mode graphique, en passant par la console texte, puis en lancant "startx"
  • Avec le bureau à distance de windows, en mode graphique, en précisant comme adresse de connexion, l'adresse ip de notre carte, soit celle précédemment relevée avec "ip a" en mode console.
  • Avec un terminal SSH (ex: le programme Putty ) sur le port 22 et sur l'adresse ip


C'est déjà pas mal, non?

Transfert sur la mémoire interne "EMMC"

A partir de ce stade, vous pouvez soit continuer sur la carte SD, soit transférer l'installation sur la mémoire interne eMMC de 8Go. Pour transférer c'est assez simple, il suffit de lancer "sudo armbian-config", et dans le menu "System" > "Install", de choisir "2 boot from emmc / system on emmc".

L'utilitaire faire le transfert et à l'issue vous demande de rebooter. Il suffira de virer la carte SD juste avant le reboot et vous devriez pouvoir booter normalement.

A noter que vous pouvez faire ceci à n'importe quel endroit de ce script d'installation, et ainsi disposer d'une carte SD de référence vous servant à réinstaller votre système sur eMMC rapidement, avec leniveau d'avancement que vous aurez choisi. Ca peut aussi service de sauvegarde pour réinstaller rapidement le système avec une carte SD complètemetn configurée... A vous de choisir.

Installation de Nodered

Faites ceci en mode console, mais pas identifié en root. Vous vous connecterez donc sur le compte utilisateur créé lors de l'installation.

bash <(curl -sL https://raw.githubusercontent.com/node-red/linux-installers/master/deb/update-nodejs-and-nodered)

Accepter l'installation des noeuds spécifiques Raspberry et lancer l'installation. Cela va prendre une trentaine de minutes.

A l'issue de l'installation, rendre le service node red rémanent et le démarrer

sudo systemctl enable nodered.service
sudo systemctl start nodered.service

Enfin nous allons installer quelques paquets complémentaires pour node-red :

cd  .node-red
npm install node-red-contrib-googlehome
npm install node-red-node-email 
npm install node-red-dashboard
npm install node-red-contrib-ui-artless-gauge
npm install node-red-contrib-ewelink
npm install node-red-contrib-opi-gpio
npm install node-red-contrib-modbus

sudo systemctl restart nodered.service

Nous pouvons maintenant connecter un navigateur à notre fraiche installation de node red sur l'adresse IP relevée avec la commande "ip a" à la place de MON_IP. Vous pouvez le faire de n'importe quel poste connecté au même réseau que votre Orange PI.

http://MON_IP:1880

Paramétrage de vi

editer .vimrc de root et de l'utilisateur que vous avez créé et ajouter la ligne

set mouse-=a

editer /etc/vim/vimrc et décommenter

syntax on

Interfaçage avec un LCD I2C

A noter que cette partie est légèrement différente de l'article original afin d'être adaptée au fonctionnalités de l'Orange PI.

Le cablage est identique et vous le retrouverez dans l'article original ( https://www.civade.com/post/2020/12/13/Google-home-Node-Red-Raspberry-pi-%3A-un-int%C3%A9ressant-cocktail-pour-la-domotique ) Nous allons passer en root pour installer ces éléments :

su -

Tour d'abord il nous faut quelques librairies

pip install wheel 
pip install setuptools
pip install psutil
pip install RPLCD

Vérifier qu'il y a bien un LCD en I2C à l'adresse 0X20 (sur orange pi, c'est sur le port 0)

i2cdetect -y 0
	 0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: 20 -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --

Ensuite nous allons pouvoir tester l'afficheur :

rplcd-tests i2c testsuite  expander=MCP23008 addr=0x20 port=0 cols=20 rows=4 charmap=A00 gpio_bank=A

Enfin nous allons tester avec un petit script en Python :

#!/usr/bin/python
# -*- coding: utf8 -*-
# Parce que les accents le valent bien...

"""
Bibliotheques à installer :
 - pip install rplcd  https://github.com/dbrgn/RPLCD (Doc sur https://rplcd.readthedocs.io/en/latest/ )
 - pip install gpiozero
 - pip install psutil

Et bien sur l'i2c doit avoir été activé sur la Rasoberry avec raspi-config.

Pour le lancer toutes le minutes, l'installer dans un crontab en root, faire crontab  -e
* * * * * /root/lcd.py >> /root/log.txt 2>&1

Un journal (log.txt) portera les erreurs... si il y en a.
"""

# Affichages sur lcd
from RPLCD.i2c import CharLCD
# température processeur
def CPUTemperature():
        with io.open('/sys/devices/virtual/thermal/thermal_zone0/temp', 'r') as f:
                return float(f.readline().strip()) / 1000
# Pour afficher l'heure
import time
# Pour recuperer l'adresse IP
import socket
# Pour capacité disque
import psutil
# Entrées sorties
import io

# Recuprere l'adresse IP
def get_ip():
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    try:
        # n'a pas besoin d'être joignable
        s.connect(('10.255.255.255', 1))
        IP = s.getsockname()[0]
    except Exception:
        IP = '127.0.0.1'
    finally:
        s.close()
    return IP

# Définit des caractères personnalisés
def lcd_chars():
    smiley = (
        0b00000,
        0b01010,
        0b01010,
        0b00000,
        0b10001,
        0b10001,
        0b01110,
        0b00000,
    )
    degre = (
        0b01000,
        0b10100,
        0b01000,
        0b00011,
        0b00100,
        0b00100,
        0b00011,
        0b00000,
    )
    lcd.create_char(0, smiley)
    lcd.create_char(1, degre)
    return

# Init
# Init LCD
lcd = CharLCD(i2c_expander='MCP23008', address=0x20, port=0,
            cols=20, rows=4, dotsize=8,
            charmap='A00',
            auto_linebreaks=True)
lcd_chars()
IP = get_ip()
cpu = CPUTemperature()
hdd = psutil.disk_usage('/')
ram = psutil.virtual_memory()

#192.168.100.100 25.9
#
#
#

lcd.clear();
# Ligne 1
lcd.cursor_pos = (0, 0)
lcd.write_string(time.strftime("%d/%m/%Y  %H:%M:%S"))
#print time.strftime("%d/%m/%Y  %H:%M:%S")

# Ligne 2
lcd.cursor_pos = (1, 0)
#line1 = "%s %s" % (IP, cpu)
lcd.write_string(IP)
lcd.cursor_pos = (1,14)
lcd.write_string("|%2.1f\x01" % (cpu))
#print "%s|%2.1f" % (IP, cpu)

# Ligne 3
lcd.cursor_pos = (2, 0)
lcd.write_string("T:%3.1fG U:%3.1fG F:%3.1fG" % (float(hdd.total) / (2.0**30), float(hdd.used) / (2.0**30),float(hdd.free) / (2.**30) ))
#print "T:%3.1fG U:%3.1fG F:%3.1fG" % (float(hdd.total) / (2.0**30), float(hdd.used) / (2.0**30),float(hdd.free) / (2.**30) )

# Ligne 4:w
lcd.cursor_pos = (3, 0)
lcd.write_string("T:%3.0fM U:%3.0fM F:%3.0fM" % (float(ram.total) / (2.0**20), float(ram.used) / (2.0**20),float(ram.free) / (2.**20) ))
#print "iT:%3.0fM U:%3.0fM F:%3.0fM" % (float(ram.total) / (2.0**20), float(ram.used) / (2.0**20),float(ram.free) / (2.**20) )

# Si on veut préserver le backlight et ne l'allumer que quelques secondes toutes les minutes
# décommenter les lignes suivantes
#time.sleep(5)
#lcd.backlight_enabled = False
lcd.close()

Et la suite?

La suite peut être retrouvée sur l'article initial basé sur une Raspberry Pi, mais tout le volet tutoriel pour poursuivre sur node red est totalement d'actualité, même si il est installé sur une Orange Pi. Il est ici : https://www.civade.com/post/2020/12/13/Google-home-Node-Red-Raspberry-pi-%3A-un-int%C3%A9ressant-cocktail-pour-la-domotique .

Bonne lecture !