home castoo
chapitre electronique
Electronique carte Yunshan HW622

Découverte du pico
rp2040 avec C++

avril 2021

Découverte de la petite derniere "la pico".

C'est chouette un nouveau jouet Raspberry :

Bon ça commencent mal, partout je vois que son prix est de 4$ et moi je ne trouve depuis la France que des offres à 7 ou 8 euros voir même 12€ avec les pins soudés ! Je me lance tout de même...

Carte Yunshan HW622

Dans le monde raspberry on développe en python (ou micro-python) dans le cas du pico il est évident que c'est beaucoup plus facile de faire ce choix de très nombreuses librairies sont déjà disponibles et une interface "Thonny" (IDE Python) est disponible et permet des développement en micro-python ultra rapide. De très nombreux exemples sont disponibles sur internet dans ce langage, c'est donc une solution plus facile que le C pour débuter ! Ce n'est pas la solution dont je vais vous parler ici, j'aime bien le python mais je préfère le C et il est jusqu'ici beaucoup plus utilisé sur les minis cartes de développement genre espxx. Il semble que les mondes Arduino et Raspberry se rapprochent, comme vous le verrez plus bas je vais donc rester fidèle à l'IDE Arduino et au C++ pour découvrir le pico...

Installation d'une config de programmation sous Windows,
je sais en principe les fans du Raspberry ont horreur de Windows et préfèrent lancer l'installation depuis une carte PI4 !
Ce n'est pas mon choix pour le moment, j'ai donc testé deux méthodes, avec VSCode (Visual Studio Code) ou avec IDE Arduino...


Le site incontournable pour le pico : https://www.raspberrypi.org/documentation/rp2040/getting-started/
Vous allez y trouver la documentation complète sous la forme d'un grand nombre de pdf à consulter en ligne ou en téléchargement (notamment la doc du sdk et des exemples).
La doc avec les exemples en C++ : https://raspberrypi.github.io/pico-sdk-doxygen/index.html

Cas 1 :Installation pour dev avec VSCode :.

Carte Yunshan HW622 Dans le site cité ci-dessus, en descendant dans la page on trouve des "inspirations" (exemples) et la première qui a attiré mon regard c'est une installation automatisée sur Windows 10.
On télécharge, on lance et on se retrouve avec une installation complète y compris de VSCode, de python et du sdk complet ainsi que tous les exemples en C++.
Bon je sais les puristes préfèrent maitriser l'installation point par point, alors pas de problème c'est expliqué dans la doc du site.
Il ne reste plus qu'à compiler les exemples, pour cela vous pouvez assez facilement trouver des sites sur "Youtube" ou suivre les instructions de l'excellent site Element 14.
Tous les exemples présents avec le sdk fonctionnent très bien mais l'utilisation de VSCode n'apporte pas grand-chose à mes yeux, "PlatformeIO" n'étant pour le moment pas disponible pour le pico, donc pas de complétion auto. La grosse difficulté est que pour chaque nouveau projet C++ il faut construire un espace de travail et un fichier CMakeLists.txt (Edition de lien pour programme Make avant compilation) manuellement qui regroupe divers options de compilation et la liste de tous les fichiers associés au projet, perso j'ai trouvé cela bien fastidieux (même si le C c'est ça !).
J'ai donc très rapidement abandonné cette solution de dev et je suis passé à la solution IDE Arduino-PICO...

Il faut mettre à jour le PATH (votre rep d'installation de pico) comme sur photo (aller dans "setting" "Extension" et chercher les lignes suivantes) :
VSCode pico rp2040
Il faut mettre à jour le générateur comme sur photo :
VSCode pico rp2040
Un exemple de code exemple sur photo sur photo (pour la compilation il faut lancer le "make" avec le tout petit icone en bas de l'écran, vous retrouverez alors tous vos fichiers prêt à être exécuté (extension UF2) dans le répertoire "build" de chaque exemple (copier coller le fichier dans la fenêtre que vous ouvrez en connectant le pico en maintenant le bouton blanc) :
VSCode pico rp2040

A vous les petits montages, mais vous avez aussi la deuxieme solution...

carte raspberry pico


Cas 1 :Installation pour dev avec l'IDE ARDUINO :.

Pour charger sous windows dans l'environnement de l'IDE Arduino les fichiers necessaire à l'utilisation du pico (rp2040) le mieux est de suivre le tuto du site sur Github : https://github.com/earlephilhower/arduino-pico Le principe :
Mise à jour des cartes : Fichier -> Preferences -> Additional boards.

Carte pico rp2040
Chargement carte : Outils -> Gestionnaire de carte -> Recherche "pico" -> Installer (il y a deux cartes l'officiel arduino et l'autre, ici on est sur l'autre !)
Carte pico rp2040
Carte pico rp2040
Ensuite vous allez dans Fichier -> exemple et vous en prenez un pour le rp2040
Choisir -> type de carte -> Raspberry Pi RP2040 Board(1.1.0) -> Generic RP2040
Carte pico rp2040
Arrive alors un moment qui n'est pas toujours évident le choix du port :
Carte pico rp2040
C'est là que les problèmes peuvent commencer en effet la détection par Windows n'est pas toujours évidente si le bon driver n'a pas été chargé.
En principe pour lancer la detection de la carte, il faut appuyer sur le petit bouton blanc du dessus de la carte pico au moment ou vous connecté le cable USB au micro windows. Windows bip et ouvre une fenêtre avec le contenu du pico.
Si vous n'obtenez pas ce fonctionnement il y a eu un probleme de chargement du drivers, il faut rechercher un peu sur le site Github l'installateur du driver.
Carte pico rp2040
Quand c'est ok vous lancez la compilation comme vous le faite pour un programme habituellement quand c'est bon vous avez le compte rendu suivant après que l'IDE arduino a terminé la compilation qu'il a ouvert la fenêtre du pico comme vu ci-dessus et qu'il a transféré le fichier "UF2" sur le pico :
Carte pico rp2040
Si ca c'est mal passé vous avez le compte rendu suivant, rien de grave l'IDE n'a seulement pas réussi à faire le transfert, en principe il faut débrancher l'USB, appuyer sur le bouton blanc du pico et en le maintenant rebrancher le pico en USB, normalement la fenêtre du pico s'ouvre, vous pouvez alors relancer la compilation.
Carte pico rp2040
Petite remarque, il faut rapidement brancher un petit bouton de reset sur le pico pour éviter de détruire la prise USB (entre broche 30 et 28 c'est le plus simple).

Des exemples disponibles sur le site Github : https://github.com/raspberrypi/pico-examples

Une petite démo d'un petit programme perso, commande ssd1306 (menu) commande d'un moteur avant arrière avec un CI L293D Utilisation de l'interface série 2 (gpio 20 et 21) utilisation de la librairie servo pour faire bouger une petite main...


Schéma du pico (rp2040) avec un OLED ssd1306 en I2C et un encodeur numerique
(sans oublier un petit bouton de reset) :
Schéma pico rp2040 ssd1306 encodeur numerique
Le code qui va avec le schéma, ce n'est qu'un exemple, je l'ai réalisé rapidement et il faut l'améliorer avant de le reproduire mais il fonctionne comme montré sur cette vidéo.


	
// Test pico
// Ecran OLED tft sd1306 et encodeur rotatif
// Utilisation de la librairie U8x8lib simple mais efficace et disponible avec IDE Arduino

#include "U8x8lib.h"
#include "Wire.h"

// Encodeur rotatif
#define encod_sw 6
#define encod_dt 7
#define encod_clk 8

U8X8_SSD1306_128X64_NONAME_HW_I2C display(/* reset=*/ U8X8_PIN_NONE);
int A_menu;
const int nb_ch_menuA = 5;
const String ch_menuA[] = {"Saisir nom","Saisir prenom","Afficher nom","Afficher prenom","Afficher tout"};
String nom = "";
String prenom = "";
String ch_result = "";
String ch_saisie = "";
uint8_t memo_pos = 99;
bool v_passage = false;

void setup(){
	display.begin();
	display.noInverse();
	display.clear();
	display.setFont(u8x8_font_px437wyse700b_2x2_r);
	display.drawString(2,2,"TEST");
	display.drawString(2,4,"PICO");
	display.setFont(u8x8_font_chroma48medium8_r);
	delay(2000);
}

// Affichage du menu et inversion de la valeur en cours de selection
void aff_menu(int pos){
	if(memo_pos != pos){
		display.setInverseFont(0);
		display.drawString(0, memo_pos, ch_menuA[memo_pos].c_str());
		for (uint8_t i = 0; i < nb_ch_menuA; i++) display.drawString(0, i, ch_menuA[i].c_str());
		display.setInverseFont(1);
		display.drawString(0, pos, ch_menuA[pos].c_str());
		display.setInverseFont(0);
		memo_pos = pos;
	}
}

// Affichage du menu Alpha des Majuscules
void aff_menu_Alpha_Maj(uint8_t pos){
	char ch_i[2];
	uint8_t vx;
	uint8_t vy;
	if(!v_passage) display.clear();
	for (uint8_t i = 64; i < 92; i++){
		snprintf(ch_i, 2, "%c", i);
		vy = (2 * ((i - 64) % 4));
		vx = ((i - 64) / 4) * 2;
		if (i == pos+64){
			display.setInverseFont(1);
			display.drawString(vx, vy, ch_i);
		}else{
			display.setInverseFont(0);
			display.drawString(vx, vy, ch_i);
		}
	}
	v_passage=true;
	display.setInverseFont(0);
}

// Selection dans le menu Alpha
uint8_t sel_menu_Alpha_detail(uint8_t max){
	max--;
	bool B_val = false, val_clk = true, memo_clk = true;
	int B_choix = 0;
	aff_menu_Alpha_Maj(B_choix);
	v_passage=false;
	while (! B_val){
		val_clk = digitalRead(encod_clk);
		if (val_clk != memo_clk){
			if (digitalRead(encod_dt) != val_clk) {
				B_choix++;
				if (B_choix > max){
					B_choix = 0;
				}
			} else { 
				B_choix--;
				if (B_choix < 0){ 
					B_choix = max;
				}
			}
			aff_menu_Alpha_Maj(B_choix);
			delay(5);
		}
		if (!(digitalRead(encod_sw))) { B_val = true; }
		memo_clk = val_clk;
		if(B_val){
			if(B_choix == max) return 0;
			B_choix += 64;
			char ch_car = B_choix;
			ch_saisie += ch_car;
			display.clear();
			display.setInverseFont(1);
			display.setFont(u8x8_font_px437wyse700b_2x2_r);
			display.drawString(0, 5, ch_saisie.c_str());
			display.setFont(u8x8_font_chroma48medium8_r);
			display.setInverseFont(0);
			delay(1000);
			display.clear();
			B_val = false;
			aff_menu_Alpha_Maj(0);
		}
	}
	return 0;
}

// Selection dans le menu à l'aide du selecteur rotatif
uint8_t sel_menu(int max){
	max--;
	bool B_val = false, val_clk = true, memo_clk = true;
	int B_choix = 0;
	aff_menu(B_choix);
	while (! B_val){
		val_clk = digitalRead(encod_clk);
		if (val_clk != memo_clk){
			if (digitalRead(encod_dt) != val_clk) { B_choix++; if (B_choix > max) B_choix = max;}
				else { B_choix--; if (B_choix < 0) B_choix = 0;}
			aff_menu(B_choix); delay(10);
		}
		if (!(digitalRead(encod_sw))) { B_val = true; } // Bouton validation
		memo_clk = val_clk;	delay(5);
	}
	aff_menu(B_choix);
	return B_choix;
}

void loop(){
	display.clear();
	A_menu = 0;
	A_menu = sel_menu(nb_ch_menuA);
	delay(300);
	switch (A_menu){
		case 0 : // Saisie du nom
			display.clear();
			display.drawString(0, 1, "Saisir NOM");
			display.drawString(0, 3, "Utiliser car [");
			display.drawString(0, 5, "pour valider");
			delay(1000);
			sel_menu_Alpha_detail(28);
			nom = ch_saisie;
			ch_saisie = "";
			delay(500);
			break;
		case 1 : // Saisie du prénom
			display.clear();
			display.drawString(0, 1, "Saisir PRENOM");
			display.drawString(0, 3, "Utiliser car [");
			display.drawString(0, 5, "pour valider");
			delay(1000);
			sel_menu_Alpha_detail(28);
			prenom = ch_saisie;
			ch_saisie = "";
			ch_result = nom + prenom;
			delay(500);
			break;
		case 2 : // Afficher nom
			display.clear();
			display.drawString(0, 5, nom.c_str());
			delay(1000);
			break;
		case 3 : // Afficher prenom
			display.clear();
			display.drawString(0, 5, prenom.c_str());
			delay(1000);
			break;
		case 4 : // Afficher tout
			display.clear();
			display.drawString(0, 5, ch_result.c_str());
			delay(1000);
			break;
	}
}	
	
	



Si vous souhaitez concevoir une carte pour développer sur pico c'est ici => Conception d'une carte de dev pico.

J'espère que cette petite présentation vous aura donné l'envie de tester ce petit pico.
Perso, je vais reprendre mes montages avec les espxx en attendant que des librairies et certains éléments sur lesquels j'ai bloqué soient résolus (entre autre passage de tableaux de char en parametre de fonction...).
D'ici un an, il sera beaucoup plus facile de travailler avec le pico car de nombreux développeur sortent des outils C++ pour simplifier la vie des amateurs.

accueil electronique

Bricolage Robotique Informatique Peinture Voyage
Téléc. portail Le robot "mécano" Astuces informatique Henri Bertrou Auvergne
Bat. Iphone 6S Le robot "solaire" Réseau couche app. Jean-Michel Castille Floride
Robot piscine Servo et IR" Réseau Les couches New York
Xiaomi M365 Le robot "thymio" Réseaux Outils L'Ouest américain
Mac Mini Le robot "Rovio" Unités grandeur inf. L'Ile Maurice
Putty SSH Windows L'Italie / Venise
Bases Raspberry Tunisie
Termius IPhone/IPad Grece
Le vieux ZX 81
...
Navigation La Rochelle CNC / Imp3D Electronique Programmation
Rencontre dauphins Les Minimes Construction CNC Alim. TPL 5110 Doc. programme
Analyse NMEA 0183 Le Vieux port CNC du commerce Carte ESP8266 Indent programme
graph. NMEA 0183 L'Ile de Ré Martyr CNC ESP8266 1 relai Prog. objet
Analyse trames AIS A visiter Réa. imp. 3D ESP8266 Alarme Prog. procédurale
Analyse AIS TCP-IP Cura impression 3D ESP8266 MQTT
Sortie en ketch Plateau CR10 ESP8266 Temp.
Echange GPS C80 Anémomètre.
HP Sun-Odyssey CNC / 3D en vrac MCP9808 Librairie
LCD yanmar Saisie Oled
Testeur nmea esp1 i2c