![]() |
Découverte du pico |
avril 2021 |
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...
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...
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
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...
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.
// 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;
}
}
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.