Python 3 sous Debian 9

Site officiel : Python => Documentation


Un fichier Python commence par :
# -*- coding: utf-8 -*-
#!/usr/bin/env python

Conventions de syntaxe en Python

Par défaut, la bibliothèque graphique Tkinter pour Python 3 n’est pas installée sous Debian 9. Pour l’installer, taper dans la console :
sudo apt-get install python3-tk

Pour exécuter un fichier Python depuis la console :
python3 nom_fichier.py


Quelques autres éléments parfois utiles par la suite :

Pour connaître les droits d’un fichier :
ls -l

Pour rendre exécutable un fichier :
chmod +x nom_fichier.py

Pour exécuter un fichier exécutable :
./nom_fichier.py
Si on veut pouvoir appeler un programme sans se soucier du répertoire de commande, le placer dans /usr/local/bin (on peut enlever l’extension .py).

Python 3 et Geany sous Debian 9

Geany est un environnement de développement léger et rapide. Pour l’installer sous Debian 9, taper dans la console :
sudo apt-get install geany

Puis dans Geany :

Dans les champs « Commande » de « Compile » et d' »Execute », remplacer python par python3 :

Pour le réglage de l’indentation, aller dans :
Editer > Préférences > Editeur > Indentation.
Sélectionner Espaces à la place de Tabulations.
Vérifier que le mode d’intentation automatique par la touche Tab soit coché et que la largeur d’indentation soit de 4.

Construire une vidéo image par image sous Debian 9

J’utilise FFmpeg.

Les images sont toutes rangées dans le même répertoire et se nomment image-0001.png, image-0002.png, image-0003.png, etc.

Pour obtenir un film à 24 images / seconde, en partant de l’image n° 1, avec un débit binaire pour l’image de 30000 kbps, on tape dans la console :
ffmpeg -r 24 -start_number 1 -i image-%04d.png -b:v 30000k output.mp4

Lien vers un article concernant la compression vidéo chez YouTube.

Assemblage d’images avec Processing

Présentation :

Le programme ci-dessous permet d’assembler des images pour en créer une plus grande.

Le code Processing :

//////////////////////////////////////////////////////////////////
/*
   Assemblage d'images
   Version de Processing utilisée : 3.5.2
   
   Important :
   ---------
   Les noms des fichiers images à assembler sont ici du type :
   image-0001.png, image-0002.png, etc.
     
   http://3615.entropie.org
*/
//////////////////////////////////////////////////////////////////

// Paramètres à adapter
String extension = ".png";  // Extension des images
int largeurImage = 200;     // Largeur d'une image
int hauteurImage = 100;     // Hauteur d'une image
int nbImagesX = 3;          // Nombre d'images à placer en largeur
int nbImagesY = 2;          // Nombre d'images à placer en hauteur
int marge = 10;             // Marge entre les images
int couleurMarge = 0;       // Couleur de la marge

// Variables
int width = largeurImage*nbImagesX + marge*(nbImagesX+1);
int height = hauteurImage*nbImagesY + marge*(nbImagesY+1);
int nbImages = nbImagesX * nbImagesY;     // Nombre total d'images
PImage img[ ]= new PImage[nbImages];      // Tableau d'images
int indexImage = 0;         // Position de l'image dans le tableau
float x,y;                  // Coin supérieur gauche de l'image

//////////////////////////////////////////////////////////////////

void settings() {
  size(width, height);
}

//////////////////////////////////////////////////////////////////

void setup() {
  for (int i=0; i<nbImages; i++) {
    // Le nom du fichier est composé de 4 chiffres + l'extension
    String nomFichier = "image-"+nf(i+1,4)+extension;
    img[i] = loadImage(nomFichier);
  }
 x = marge;
 y = marge;
 background(couleurMarge);
}

//////////////////////////////////////////////////////////////////

void draw() {
  if (indexImage < nbImages) {
    image(img[indexImage], x, y, largeurImage, hauteurImage);
    indexImage++;
    x = x + largeurImage + marge;
    if (x >= width) {
      x = marge;
      y = y + hauteurImage + marge; 
    }  
  }
  else { save("assemblage.png"); }
}

//////////////////////////////////////////////////////////////////

void keyPressed() {
  if (key == ESC) {
    exit();
  }
}

//////////////////////////////////////////////////////////////////

SD2IEC pour Commodore 64

Vendeur : https://www.ebay.fr/usr/despegatop
Mode d’emploi : Commodore SD2IEC user guide

Après avoir formaté sur mon PC la carte SD (8 Go) en FAT32, je l’insère dans le boitier SD2IEC, j’allume le C64 et je tape :
10 PRINT « HELLO WORLD »
SAVE « HELLO »,8
Le programme est alors sauvegardé directement sur la carte SD.
Pour vérifier que tout a bien fonctionné, je charge la liste des fichiers de la carte dans la mémoire de l’ordinateur :
LOAD « $ »,8
J’affiche cette liste :
LIST
Le programme « HELLO » apparaît bien.
Je vide la mémoire de l’ordinateur :
NEW
Je charge le programme à partir de la carte SD :
LOAD « HELLO »,8
J’affiche le listing du programme :
LIST
Je l’exécute :
RUN

Retour de la carte SD sur le PC avec un éditeur hexadécimal :

Commodore 64 : Guide de référence du programmeur

Tweeter avec un Minitel

Le matériel à mettre en oeuvre : Le minitel, le câble DIN-USB, une Arduino Uno, le shield 3615, un Raspberry Pi.

On crée un compte Twitter puis une application Twitter depuis cette adresse : https://apps.twitter.com.

On règle les permissions.

On récupère les clés qui sont dans les 4 zones rouges. Elles seront utilisées ultérieurement dans le fichier Python minitel.py.

Le programme minitel.py utilise Twython.
Il faut donc installer (sudo apt-get install) :
pour Python 2.7 : python-twython / python-oauth / python-oauth2client / python-oauthlib / python-requests-oauthlib
pour Python 3 : python3-twython / python3-oauth / python3-oauth2client / python3-oauthlib / python3-requests-oauthlib

Pour que le programme minitel.py se lance dès qu’on allume le Raspberry Pi, on ajoute la ligne suivante dans le fichier /etc/rc.local :
su -l pi -c "python /home/pi/3615/minitel.py &"

Dans le fichier /boot/cmdline.txt , il faut enlever « console=ttyAMA0,115200 ».

Enfin, pour pouvoir tweeter, le Raspberry Pi doit être à l’heure sinon on a en retour le message « Twitter API returned a 401 (Unauthorized), Timestamp out of bounds. ». J’ai donc ajouté une horloge temps réel sur le Raspberry Pi : http://www.nagashur.com/wiki/doku.php?id=raspberry_pi:ds3231_rtc_horloge

Pour consulter l’heure et la date contenue dans le module :

sudo hwclock

Pour mettre à l’heure le Raspberry Pi manuellement :

sudo date -s "2017-06-18 17:10"
sudo hwclock -w

Pour ce qui concerne l’interface Minitel gérée par l’Arduino, le programme qui utilise Minitel1B_Soft est ici.

Enfin, il reste à relier le shield 3615 au Raspberry Pi :
TX0′ du shield > RXD du Raspberry Pi (broche 10)
RX0′ du shield > TXD du Raspberry Pi (broche 8)
GND du shield > GND du Raspberry Pi (broche 6)

Fabrication du câble Minitel-Shield

Se procurer le matériel suivant :

  • Minitel 1B avec une prise péri-informatique disposant d’une sortie alimentation sur la broche 5 (type Cu5 / Cu; / Cu< / Bu0 et suivants).
  • Cordon USB A mâle – USB B mâle.
  • Fiche Din mâle 5 contacts à 45° avec collier serre-câble.
  • Gaine thermorétractable transparente 1,2 mm avant retreint.

Le principe : On coupe le connecteur USB B du cordon et on le remplace par la fiche Din.

Pour tout comprendre, partons de la documentation du Minitel :

Les numéros de broches sont positionnés de la même manière pour la fiche DIN mâle vue côté soudures.

Concernant le connecteur USB A, nous avons :

Etant donnés les choix faits au niveau du shield 3615 :
D- vers broche 8 de l’Arduino
D+ vers broche 9 de l’Arduino

Etant donnée la ligne de code suivante dans les exemples de la bibliothèque Minitel1B_Soft :
Minitel minitel(8, 9); // RX, TX

Il faudra souder, pour avoir un câble croisé :

  • Le fil vert à la broche 1 de la fiche DIN
  • Le fil noir à la broche 2 de la fiche DIN
  • Le fil rouge à la broche 5 de la fiche DIN
  • Le fil blanc à la broche 3 de la fiche DIN

Résolution du problème lié à la bibliothèque SD (Arduino 1.0.5) sur l’ATmega1284P

Pour utiliser la bibliothèque SD standard avec l’ATmega1284P, il faut modifier le fichier Sd2PinMap.h que l’on trouve dans le répertoire du logiciel Arduino à cette adresse (sur ma Debian 8) :
/usr/share/arduino/libraries/SD/utility/Sd2PinMap.h :
On tapera dans la console : sudo geany sd2PinMap.h (pour éditer le fichier en mode administrateur)