vendredi 29 janvier 2010

QT4 - Quelques tuyaux utiles:

Bonjour,
Je fais une petite récap. de choses simples mais pas évidentes lorsqu'on débute avec Qt4:

/*=================================================================
* Ecrire des lignes de texte dans un QTextEdit
*==================================================================*/
QTextEdit TextEdit1;
QString str1, str2;
// 1- associer un "QTextCursor"
QTextCursor cursor1(textEdit1->document());
cursor1.movePosition(QTextCursor::Down, QTextCursor::MoveAnchor, 0);
cursor1.select(QTextCursor::LineUnderCursor);
//return cursor1.selectedText();

// 2- écrire les lignes et les terminer par un "\n" (saut de ligne)

cursor1.insertText(str1);
cursor1.insertText("\n"); //saut de ligne

cursor1.insertText(str2);

/*=================================================================
* Lire une ligne de texte dans un QTextEdit
*==================================================================*/

//retourne la ligne i du QTextEdit
QTextEdit TextEdit1;
QString str1;
QTextCursor cursor1(textEdit1->document());
cursor1.movePosition(QTextCursor::Down, QTextCursor::MoveAnchor, i);
cursor1.select(QTextCursor::LineUnderCursor);
str1 = cursor1.selectedText();

/*=================================================================
* Copier tout le contenu d'un QTextEdit
*==================================================================*/
QTextEdit TextEdit1;
TextEdit1 ->copy();

/*=================================================================
* Lire le contenu d'une cellule d'un QTableWidget
*==================================================================*/
QTableWidget TableWidget1
QString texte_lu;
int row = TableWidget1->currentRow(); // ligne courante (par exemple sélectionnée à la souris)
int coll = 2; // par exemple
TableWidget1->setCurrentCell(row,coll); //selectionne la cellule
texte_lu = TableWidget1->currentItem()->text();

/*=================================================================
* Ecrire dans une cellule d'un QTableWidget
*==================================================================*/

QString str1;
int r = TableWidget1->currentRow();
int coll = 2; // par exemple
TableWidget1->setItem(r, coll, new QTableWidgetItem (str1) );

/*=================================================================
* Dessiner (et ecrire) dans un QPixMap
*==================================================================*/

// 1- déclarer et dimensionner le pixmap
QPixmap pixmap1(200,400);
// 2- lui associer un 'QPainter'
QPainter painter1(& pixmap1); // adresse de pixmap1 dans le constructeur
// 3- choisir la couleur du trait et celle de remplissage
painter1.setPen(Qt::cyan);
painter1.setBrush(Qt::white);
// 4- dessiner
painter1.drawEllipse(100,50, 8, 12);
// 5- ecrire:
painter1.drawText("coucou!");
// 5- IMPORTANT: pour rendre le pixmap visible, l'associer à un QLabel! (ou autre widget AYANT un pixmap...)
label1->setPixmap(pixmap1);
// attention: par la suite, ne pas associer un autre pixmap au label, mais toujours copier le même

dimanche 15 novembre 2009

Programmer en C et Qt4 pour Linux


Je programmais depuis des années en Pascal (Delphi) sous Windows. Désirant me passer totalement de cet OS, j'ai recherché des outils de programmation sous Linux.
J'ai tout d'abord utilisé l'équivalent de Delphi, à savoir Lazarus. En fait depuis des années, je boudais le langage C.

Puis j'ai fini par apprendre le C afin de pouvoir programmer les microcontroleurs AVR sous Linux (Avec KontrollerLab). Et en définitive j'ai trouvé que le langage C n'est pas si mal que ça! Les "pascaliens" le dénigrent souvent, moi j'ai testé et je l'ai adopté! D'autant que c'est un langage très ouvert, avec plein de bibliothèques très diverses en open source.

Il me restait alors à trouver un environnement intégré permettant de programmer des applications pour Linux en C, avec fenêtres, boites de dialogues, de saisies, boutons etc...

Après avoir essayé plusieurs solutions que je ne veux pas critiquer, j'ai trouvé qdevelop qui me donne entière satisfaction.

qdevelop permet la programmation en C/C++ et la gestion d'une interface graphique en Qt4 avec Qt4 designer.

Voici un aperçu de Qt4 Designer:


A noter que Qt4 Designer est directement accessible DEPUIS qdevelop par un simple clic sur le fichier ".ui" et que les modifications apportées aux objets graphiques (on dit "widgets" en langage Qt) sont automatiquement répercutées dans le code source de l'application.

Je viens de publier sur mon site un programme (avec les sources) écrit avec qdevelop.

Vous y trouverez une fenêtre principale comprenant:
  • un "menu"
  • des boutons
  • des boutons avec un "icon" dessus
  • des QLineEdit (boites de saisie texte)
  • un QComboBox (liste de choix, déroulante)
  • un QTextEdit ( equiv. Tmemo delphi, avec nombreuses fonctions d'éditions)
  • un QTableWidget (equiv. TStringGrid delphi avec fonctions de tri intégrées...)
Dans le code source en C du programme associé vous verrez comment exploiter les propriétés et les évènements générés par ces objets, en particulier comment:
  • copier le contenu texte du presse papier dans le QLineEdit
  • trouver une ligne dans ce QTextEdit contenant un texte donné
  • recopier une ligne ou un mot du QTextEdit dans un QLineEdit
  • recopier le contenu d'un QLineEdit dans une case du QTableWidget
  • lire et sauvegarder sur le disque dur le contenu du QTableWidget
  • utiliser des onglets: QTabWidget
  • DESSIN: dessiner avec des droites, des ellipses etc... sur une grande surface (dans un QPixmap associé à un QLabel )
  • utiliser des couleurs pour dessiner et écrire
  • récupérer les coordonnées de la souris lors d'un clic dans le pixmap
  • etc...


Tout cela semble facile mais pour ceux qui ont l'habitude de Delphi, ces opérations de base se font dans une syntaxe extrêmement déroutante! On s'y fait en quelques jours, mais au départ j'ai ramé grave! Mais je vous assure que cela vaut la peine! Et cet exemple que je vous donne, vous permettra je pense de gagner du temps.
.
.
.
.
.
.
.
.

Voici la page de mon site concernée:
Pour voir tourner ce programme sans rien "installer", sous linux:
  1. télécharger l'archive "ape2009_src_vx.x.tar.gz" dans votre dossier personnel
  2. la décompresser sur place (crée un dossier ape2009_src_vx.x avec tout dedans, et rien ailleurs dans l'ordi)
  3. dans ce dossier, aller dans le sous-dossier "bin" et exécuter le fichier "APE2009" (le rendre executable si ce n'est pas le cas (clic de droite, propriétés, permissions, cocher "exécution") )






Sous Windows? Vous devrez recompiler les sources (fournies également)



Silicium628


Quelques liens externes:

mardi 20 octobre 2009

Décodage d'une trame RC5 (télécommande TV)


Ou comment utiliser une télécommande infra-rouge pour piloter un microcontrôleur

J'ai écrit cette fonction en langage C que j'utilise, une fois compilée avec avr-gcc sur des uC AVR ATmega
On suppose que le module récepteur IR est relié au pin7 du port D
  • Fonctions RC5 (code source en C, fichier texte, encodage des caractères en UTF8)

------------------------------------------------------------------------------------------------------------------------------

Des exemples d'utilisation sur mon site:
Documentation sur le codage RC5:
Silicium628

lundi 19 octobre 2009

Programmation des AVR en langage C, sous LINUX


Actuellement Les microcontroleurs AVR ATmega sont devenu très abordables. En particulier les ATmega32 qui possèdent suffisamment de mémoire de programme flash (32ko) nous donnent la possibilité de les programmer en langage de haut niveau comme le Pascal ou le Langage C.

Il est de plus possible de les programmer avec des logiciels libres (sous licence GNU) en travaillant sous LINUX, un OS libre également!

Le logiciel en question c'est Kontrollerlab. Je l'utilise régulièrement et j'en suis tout à fait satisfait. C'est en fait un tableau de bord qui permet de saisir et d'éditer le code source, de le compiler (en utilisant avr-gcc), de lier les fichiers, de programmer l'ATmega. Il y a même un mode simulation.

Ceci n'est pas de la publicité commerciale puisqu'il s'agit de logiciels et de codes sources libres et 100% gratuits.

Je donne plus de détails sur la page ATmega de mon site.

Silicium628

Comment relier électriquement une SD card à un ATmega


Les uC ATmega d'AVR disposent d'une SPI (Serial Peripheral Interface) tout comme les cartes mémoires SDcard. Donc la liaison peut se faire directement en reliant MISO àMISO, MOSI à MOSI etc... et paramétrant correctement la SPI, en particulier la fréquence de SCK à 125kHz.

sauf que...

Sauf que dans bien des cas des contraintes obligent à alimenter l'ATmega sous 5V alors que les SDcard doivent être alimentées en 3,3V et rien d'autre. Dans ce cas, une liaison directe détruirait la SDcard.

Il faut donc concevoir une alimentation 3V3 et un adaptateur de niveaux logiques.
  • Pour les signaux qui sortent de l'ATmega et entrent dans la SD card (MOSI, CS, SCK), il faut limiter la tension du niveau haut à 3,3V . Une solution consiste à utiliser une résistance en série et une diode à faible tension directe (diode schottky) reliée au 3V3.
  • Pour le signal qui sort de SDcard et entre dans l'ATmega (MISO =Maitre-In, Slave-Out) il faut au contraire augmenter la valeur du niveau haut de 3V3 vers 5V. (Le datasheet de l'ATmega32 indique que, alimenté sous 5V, le niveau haut en entrée doit se situer au dessus de 0,7 x VCC soit >3,5V ce qui est > à 3,3V). Certes une connexion directe PEUT fonctionner, mais ce n'est pas garanti. On peut donc utiliser soit deux transistors en montage émetteur commun (deux afin de ne pas inverser le signal logique), soit un seul transistor monté en base commune.
D'où le schéma proposé (et testé ok)

Pour le soft, c'est une autre histoire (voir APE2009 Goto pour téléscope sur mon site...)
Silicium628

Message de bienvenue


Bienvenue chez Silicium628.

Je crée ce blog pour permettre aux passionnés d'électronique comme moi, et plus particulièrement aux développeurs de logiciels en C pour les microcontrôleurs AVR d'échanger leurs remarques, critiques et informations.

Je dispose également d'un site ( http://www.silicium628.fr/ ) décrivant plusieurs réalisations personnelles à base de ces uC, mais ne permettant pas l'interactivité avec les internautes. Voilà qui est chose faite.

Je publierai aussi ici des notes de mises à jour concernant mes différents montages, ainsi que les bugs (et solutions!) éventuels.

Je vous laisse donc la parole.
Fred (Silicium628)