Ce week-end a eu lieu la troisième exposition de modélisme à la ferme du Manet à Montigny-le-Bretonneux. De nombreuses belles réalisations y étaient présentées et en particulier pour le ferroviaire. Beau succès avec 5000 visiteurs !
lundi 20 novembre 2023
Exposition de modélisme à Montigny-le-Bretonneux
lundi 2 octobre 2023
Essais dynamiques de la gare d'échange Nouvelle Génération
La période estivale n'est pas forcément synonyme de ralenti. Nous avons mis à profit le mois d'Août pour effectuer des essais sur un grand réseau.
Le Poste Opérateur:
Le Poste permet de commander les itinéraires mais aussi la traction dans l'ensemble de la gare d'échanges. Le logiciel Orchestra fonctionne sous Linux avec un PC ayant une configuration matérielle minimaliste.
Les interfaces:
Vidéo :
vendredi 1 septembre 2023
Serre Lumineuse
En modélisme, il est assez fréquent de réutiliser des objets et de les détourner de leur usage initial. Pour éclairer une petite serre de jardin dans un décor, on peut s'orienter vers un montage classique avec une ou deux LEDs RVB. Nous avons déjà réalisé ce type de montage qui fonctionne très bien mais il nécessite un circuit (Arduino, WEEMOS, ...) pour piloter les LEDs et une alimentation 5V adaptée.
jeudi 3 août 2023
Sonorisation : quelques compléments
Toujours à l'affut de composants ou montages électroniques intéressants, nous avons fait quelques trouvailles qui touchent à la sonorisation et qui pourraient vous intéresser.
Les HP ne sont pas que circulaires. Le modèle ci-dessous rectangulaire est bien plus adapté à nos montages dans les wagons (voire locomotives/tender). Le rendu sonore est tout aussi bon.
jeudi 13 juillet 2023
L' écran TFT sur la maquette du vélodrome
lundi 3 juillet 2023
Vidéo surveillance des trains
La vidéo surveillance est de plus en plus présente dans notre environnement et il est aussi de plus en plus facile de la déployer avec du matériel du commerce. Les différentes caméras miniatures sont désormais de très bonne qualité, pas chères, et en plus sont de véritables objets connectés. Pour notre loisir, il est intéressant de l'essayer pour savoir si cela est valable pour surveiller les trains sur un réseau miniature.
La suite ici.
dimanche 14 mai 2023
Joystick pour accessoires
Les télécommandes sont toujours utiles pour des applications très variées en modélisme (ex: la commande de portique). Nous nous sommes intéressés à une télécommande de type Joystick. Certes, il en existe toute faite et qui fonctionnent très bien mais nous allons voir comment en faire une à partir d'éléments Arduino.
Le Principe:
Le montage sera très simple puisqu'il consiste à assembler un module Arduino Méga et le module Joystick Shield. A noter que l'on peut aussi utiliser un Arduino Uno. Peu de chance de se tromper lorsque l'on assemble les deux modules mais pour éviter toute mauvaise surprise une petite astuce: les alimentations 5V et 3,3V sont repérées sur le module Joystick Shield (en bas à gauche sur la photo ci-après) et aussi sur les connecteurs de l'Arduino. Il suffit de les faire coïncider (alimentation externe et prise USB à gauche sur la photo ci-après). Bien mettre l'interrupteur en bas à gauche du module Joystick Shield sur 3,3V.
L'ensemble des modules est alimenté par l'Arduino (prise externe ou par USB). Une LED témoin indique que le module Joystick Shield est sous tension.
Pour notre exemple, nous avons câblé deux servo-moteurs (deux modèles différents) sur les sorties D9 et D10 du Joystick Shield (en haut à gauche sur la photo). Les alimentations 3,3V et GND pour les servos sont prises sur le même connecteur du module Shield.
Le code:
Il faut utiliser la librairie servo pour initialiser et commander ceux-ci. Les boutons (de couleur jaune et bleu) sont définis en fonctions des directions (UP = HAUT, DOWN = BAS, LEFT = GAUCHE, RIGHT = DROITE). A noter qu'il y a deux boutons E et F de réserve (en noir à gauche de boutons de couleur). Les axes X et Y du Joystick sont les entrées analogiques A0 et A1 (défini par câblage). La fonction map est importante car elle adapte l'échelle de conversion des valeurs analogique en numérique pour assurer un contrôle adapté.
[code]
#include <Servo.h>
// define global variables for analog pins.
Servo myservo_x;
Servo myservo_y;
int value_x = 0;
int value_y = 0;
// X values will be read from pin 0 and Y from pin 1
#define PIN_ANALOG_X A0
#define PIN_ANALOG_Y A1
#define BUTTON_UP 2
#define BUTTON_RIGHT 3
#define BUTTON_DOWN 4
#define BUTTON_LEFT 5
#define BUTTON_E 6
#define BUTTON_F 7
#define DELAY 500
#define PIN_SERVO_X 9
#define PIN_SERVO_Y 10
void setup() {
// Start serial because we will observe values at serial monitor
Serial.begin(9600);
// to enable pull up resistors first write pin mode
// and then make that pin HIGH
pinMode(BUTTON_UP, INPUT);
digitalWrite(BUTTON_UP, HIGH);
pinMode(BUTTON_RIGHT, INPUT);
digitalWrite(BUTTON_RIGHT, HIGH);
pinMode(BUTTON_DOWN, INPUT);
digitalWrite(BUTTON_DOWN, HIGH);
pinMode(BUTTON_LEFT, INPUT);
digitalWrite(BUTTON_LEFT, HIGH);
pinMode(BUTTON_E, INPUT);
digitalWrite(BUTTON_E, HIGH);
pinMode(BUTTON_F, INPUT);
digitalWrite(BUTTON_F, HIGH);
myservo_x.attach(PIN_SERVO_X);
myservo_x.write(180);
delay (1500);
myservo_y.write(0);
myservo_y.attach(PIN_SERVO_Y);
myservo_y.write(180);
delay (1500);
myservo_y.write(0);
}
void loop() {
// Print x axis values
Serial.print("x: ");
value_x = analogRead(PIN_ANALOG_X);
value_x = map(value_x ,0, 1023, 0, 180);
Serial.println(value_x);
myservo_x.write(value_x);
delay(DELAY);
// Print y axis values
Serial.print("y: ");
value_y = analogRead(PIN_ANALOG_Y);
value_y = map(value_y ,0, 1023, 0, 180);
Serial.println(value_y);
myservo_y.write(value_y);
// Some delay to clearly observe your values on serial monitor.
if(digitalRead(BUTTON_UP) == LOW) {
Serial.println("Button A is pressed");
myservo_y.write(180);
delay(DELAY);
}
else if(digitalRead(BUTTON_RIGHT) == LOW) {
Serial.println("Button B is pressed");
myservo_x.write(180);
delay(DELAY);
}
else if(digitalRead(BUTTON_DOWN) == LOW) {
Serial.println("Button C is pressed");
myservo_y.write(0);
delay(DELAY);
}
else if(digitalRead(BUTTON_LEFT) == LOW) {
Serial.println("Button D is pressed");
myservo_y.write(0);
delay(DELAY);
}
}
[/code]
Vous pouvez observer les valeurs avec la console série.
Une petite vidéo pour illustrer :
A vous de jouer!
lundi 1 mai 2023
Valise de test des locos remise à jour
La valise de test de test des locomotives équipées en DCC a été mise à jour. Elle permet de vérifier et configurer les décodeurs DCC de tous types, pour du 2 rails et 3 rails.
Le PC de commande est complétement remis à jour avec le SPROG 3.
jeudi 13 avril 2023
Mini écrans : affichage d'images
Les essais avec les écrans se poursuivent avec cette fois-ci le grand modèle 3.5 pouces 320 * 480 HD qui s'insère directement sur un Arduino MEGA2560. Avec cela l'affichage des images c'est du sérieux!
Vue de l'écran monté sur l'Arduino MEGA2560
Aucune difficulté de montage ni de risque de se tromper dans le branchement. Au dos de l'écran on trouve un lecteur de carte SD intégré.
Il est très important de bien préparer les images avec le bon outil et surtout au bon format. Sans cela aucun affichage...
Pour cet écran, les images sont à retailler en 320 * 480 px et à sauvegarder en bitmap (.bmp) 24 bits.
Faites aussi attention de bien inverser l'image car le programme affiche en miroir!
Le nommage des images doit être cohérent des noms dans le code ci-après (01.bmp à 04.bmp).
Le code:
// IMPORTANT: LCDWIKI_KBV LIBRARY MUST BE SPECIFICALLY
// CONFIGURED FOR EITHER THE TFT SHIELD OR THE BREAKOUT BOARD.
//This program is a demo of how to show a bmp picture from SD card.
//Set the pins to the correct ones for your development shield or breakout board.
//the 16bit mode only use in Mega.you must modify the mode in the file of lcd_mode.h
//when using the BREAKOUT BOARD only and using these 16 data lines to the LCD,
//pin usage as follow:
// CS CD WR RD RST D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 D10 D11 D12 D13 D14 D15
//Arduino Mega 40 38 39 / 41 37 36 35 34 33 32 31 30 22 23 24 25 26 27 28 29
//Remember to set the pins to suit your display module!
#include <SD.h>
#include <SPI.h>
#include <LCDWIKI_GUI.h> //Core graphics library
#include <LCDWIKI_KBV.h> //Hardware-specific library
//the definiens of 16bit mode as follow:
//if the IC model is known or the modules is unreadable,you can use this constructed function
LCDWIKI_KBV my_lcd(ILI9486,40,38,39,-1,41); //model,cs,cd,wr,rd,reset
#define BLACK 0x0000
#define BLUE 0x001F
#define RED 0xF800
#define GREEN 0x07E0
#define CYAN 0x07FF
#define MAGENTA 0xF81F
#define YELLOW 0xFFE0
#define WHITE 0xFFFF
#define PIXEL_NUMBER (my_lcd.Get_Display_Width()/4)
#define FILE_NUMBER 4
#define FILE_NAME_SIZE_MAX 20
uint32_t bmp_offset = 0;
uint16_t s_width = my_lcd.Get_Display_Width();
uint16_t s_heigh = my_lcd.Get_Display_Height();
//int16_t PIXEL_NUMBER;
char file_name[FILE_NUMBER][FILE_NAME_SIZE_MAX];
uint16_t read_16(File fp)
{
uint8_t low;
uint16_t high;
low = fp.read();
high = fp.read();
return (high<<8)|low;
}
uint32_t read_32(File fp)
{
uint16_t low;
uint32_t high;
low = read_16(fp);
high = read_16(fp);
return (high<<8)|low;
}
bool analysis_bpm_header(File fp)
{
if(read_16(fp) != 0x4D42)
{
return false;
}
//get bpm size
read_32(fp);
//get creator information
read_32(fp);
//get offset information
bmp_offset = read_32(fp);
//get DIB infomation
read_32(fp);
//get width and heigh information
uint32_t bpm_width = read_32(fp);
uint32_t bpm_heigh = read_32(fp);
if((bpm_width != s_width) || (bpm_heigh != s_heigh))
{
return false;
}
if(read_16(fp) != 1)
{
return false;
}
read_16(fp);
if(read_32(fp) != 0)
{
return false;
}
return true;
}
void draw_bmp_picture(File fp)
{
uint16_t i,j,k,l,m=0;
uint8_t bpm_data[PIXEL_NUMBER*3] = {0};
uint16_t bpm_color[PIXEL_NUMBER];
fp.seek(bmp_offset);
for(i = 0;i < s_heigh;i++)
{
for(j = 0;j<s_width/PIXEL_NUMBER;j++)
{
m = 0;
fp.read(bpm_data,PIXEL_NUMBER*3);
for(k = 0;k<PIXEL_NUMBER;k++)
{
bpm_color[k]= my_lcd.Color_To_565(bpm_data[m+2], bpm_data[m+1], bpm_data[m+0]);
m +=3;
}
for(l = 0;l<PIXEL_NUMBER;l++)
{
my_lcd.Set_Draw_color(bpm_color[l]);
my_lcd.Draw_Pixel(j*PIXEL_NUMBER+l,i);
}
}
}
}
void setup()
{
Serial.begin(9600);
my_lcd.Init_LCD();
my_lcd.Fill_Screen(BLUE);
//s_width = my_lcd.Get_Display_Width();
//s_heigh = my_lcd.Get_Display_Height();
//PIXEL_NUMBER = my_lcd.Get_Display_Width()/4;
if(PIXEL_NUMBER == 60)
{
strcpy(file_name[0],"flower.bmp");
strcpy(file_name[1],"tiger.bmp");
strcpy(file_name[2],"tree.bmp");
strcpy(file_name[3],"RedRose.bmp");
}
else
{
strcpy(file_name[0],"01.bmp");
strcpy(file_name[1],"02.bmp");
strcpy(file_name[2],"03.bmp");
strcpy(file_name[3],"04.bmp");
}
//Init SD_Card
pinMode(53, OUTPUT);
if (!SD.begin(53))
{
my_lcd.Set_Text_Back_colour(BLUE);
my_lcd.Set_Text_colour(WHITE);
my_lcd.Set_Text_Size(1);
my_lcd.Print_String("SD Card Init fail!",0,0);
}
}
void loop()
{
int i = 0;
File bmp_file;
my_lcd.Set_Rotation(1);
my_lcd.Set_Text_Mode(0);
my_lcd.Set_Text_colour(RED);
my_lcd.Set_Text_Back_colour(BLACK);
my_lcd.Set_Text_Size(1);
my_lcd.Print_String("a b c d e f g h i j k l m n o p q r s t u v w x y z", 87, 10);
my_lcd.Print_String("A B C D E F G H I J K L M N O P Q R S T U V W X Y Z", 87, 20);
my_lcd.Set_Text_colour(GREEN);
my_lcd.Set_Text_Size(2);
my_lcd.Print_String("a b c d e f g h i j k l m", 90, 40);
my_lcd.Print_String("n o p q r s t u v w x y z", 90, 60);
my_lcd.Print_String("A B C D E F G H I J K L M", 90, 80);
my_lcd.Print_String("N O P Q R S T U V W X Y Z", 90, 100);
my_lcd.Set_Text_colour(BLUE);
my_lcd.Set_Text_Size(3);
my_lcd.Print_String("a b c d e f g h i j k l m", 15, 130);
my_lcd.Print_String("n o p q r s t u v w x y z", 15, 160);
my_lcd.Print_String("A B C D E F G H I J K L M", 15, 190);
my_lcd.Print_String("N O P Q R S T U V W X Y Z", 15, 220);
my_lcd.Set_Text_colour(CYAN);
my_lcd.Set_Text_Size(1);
my_lcd.Print_String("0 1 2 3 4 5 6 7 8 9", 183, 255);
my_lcd.Set_Text_colour(WHITE);
my_lcd.Set_Text_Size(2);
my_lcd.Print_String("0 1 2 3 4 5 6 7 8 9", 126, 265);
my_lcd.Set_Text_colour(MAGENTA);
my_lcd.Set_Text_Size(3);
my_lcd.Print_String("0 1 2 3 4 5 6 7 8 9", 69, 285);
//display 1 times string
delay(2000);
my_lcd.Set_Rotation(0);
my_lcd.Fill_Screen(0x0000);
my_lcd.Set_Text_colour(RED);
my_lcd.Set_Text_Back_colour(BLACK);
my_lcd.Set_Text_Size(1);
my_lcd.Print_String("EXPO LPT!", 0, 0);
my_lcd.Print_Number_Float(01234.56789, 2, 0, 8, '.', 0, ' ');
my_lcd.Print_Number_Int(0xDEADBEF, 0, 16, 0, ' ',16);
//my_lcd.Print_String("DEADBEF", 0, 16);
//display 2 times string
my_lcd.Set_Text_colour(GREEN);
my_lcd.Set_Text_Size(2);
my_lcd.Print_String("EXPO LPT!", 0, 40);
my_lcd.Print_Number_Float(01234.56789, 2, 0, 56, '.', 0, ' ');
my_lcd.Print_Number_Int(0xDEADBEF, 0, 72, 0, ' ',16);
//my_lcd.Print_String("DEADBEEF", 0, 72);
//display 3 times string
my_lcd.Set_Text_colour(BLUE);
my_lcd.Set_Text_Size(3);
my_lcd.Print_String("EXPO LPT!", 0, 104);
my_lcd.Print_Number_Float(01234.56789, 2, 0, 128, '.', 0, ' ');
my_lcd.Print_Number_Int(0xDEADBEF, 0, 152, 0, ' ',16);
// my_lcd.Print_String("DEADBEEF", 0, 152);
//display 4 times string
my_lcd.Set_Text_colour(WHITE);
my_lcd.Set_Text_Size(4);
my_lcd.Print_String("EXPO LPT!", 0, 192);
//display 5 times string
my_lcd.Set_Text_colour(YELLOW);
my_lcd.Set_Text_Size(5);
my_lcd.Print_String("EXPO LPT!", 0, 224);
//display 6 times string
my_lcd.Set_Text_colour(CYAN);
my_lcd.Set_Text_Size(6);
my_lcd.Print_String("EXPO LPT!", 0, 266);
//display 7 times string
my_lcd.Set_Text_colour(RED);
my_lcd.Set_Text_Size(7);
my_lcd.Print_String("EXPO LPT!", 0, 315);
//display 8 times string
my_lcd.Set_Text_colour(MAGENTA);
my_lcd.Set_Text_Size(8);
my_lcd.Print_String("EXPO LPT!", 0, 372);
delay(2000);
my_lcd.Fill_Screen(0x0000);
for(i = 0;i<FILE_NUMBER;i++)
{
bmp_file = SD.open(file_name[i]);
if(!bmp_file)
{
my_lcd.Set_Text_Back_colour(BLUE);
my_lcd.Set_Text_colour(WHITE);
my_lcd.Set_Text_Size(1);
my_lcd.Print_String("didnt find BMPimage!",0,10);
while(1);
}
if(!analysis_bpm_header(bmp_file))
{
my_lcd.Set_Text_Back_colour(BLUE);
my_lcd.Set_Text_colour(WHITE);
my_lcd.Set_Text_Size(1);
my_lcd.Print_String("bad bmp picture!",0,0);
return;
}
draw_bmp_picture(bmp_file);
bmp_file.close();
delay(2000);
}
}
[/code]
Une petite vidéo pour illustrer:
vendredi 31 mars 2023
Mini-écrans
Les écrans sont partout! Il suffit de se déplacer dans le métro pour constater que même les affiches sont progressivement remplacées par des grands écrans. Idem dans certaines communes où les informations communales et des publicités sont diffusées non-stop. Nous vous proposons de découvrir comment mettre en œuvre de petits écrans pour moderniser les décors de vos réseaux où pour d'autres applications en modélisme.
mardi 21 mars 2023
Commande PWM en action
Le module PWM a été mis en œuvre sur le module mini-Fête foraine afin de remplacer l'ancienne commande qui était réalisée avec un Arduino et une carte de puissance. Le fonctionnement de cette solution Arduino était hélas perturbée durant la dernière grande exposition et finalement difficilement exploitable.
Le module PWM a été connecté directement sur la prise associée aux rails du petit circuit autour de la fête foraine. L'alimentation est faite par un adaptateur secteur délivrant du 12V continu.
dimanche 5 mars 2023
Le retour de la mini Fête Foraine
La mini fête foraine est de retour pour se refaire une beauté! Vous aviez été nombreux à l'admirer lors de l'exposition à la ferme du Manet en 2019. Pour la prochaine exposition, toujours au Manet, cet automne 2023, nous avons fait une révision complète et des améliorations. C'est parti pour une petite revue des changements.
La première modification est la mise en boitier de la toute la partie électronique. Auparavant cela était dans un boiter de PC récupéré. Nous avons désormais mis tout cela aux normes avec une prise sécurisé pour le secteur et intégré tous les connecteurs au boitier. Plus aucun paquet de fils et toujours avec un système de détrompeur pour ne pas faire d'erreur dans les raccordements. Cela permettra à tous les membres de faire facilement le montage!
vendredi 3 février 2023
Module sonore simple et puissant
Nous vous proposons un petit montage simple pour la sonorisation de vos réseaux. Encore un ! Oui mais celui-ci, le DFPlayer, a quelque chose de plus que les précédents car il est facilement adaptable pour de nouveaux sons.
Description du DFPlayer :
Le DFPlayer Mini MP3 Player est un petit module MP3 à bas prix avec une sortie amplifiée directement sur le haut-parleur. Le module peut être utilisé comme un module autonome avec une batterie, un haut-parleur et des boutons poussoirs ou utilisé en combinaison avec un Arduino UNO ou tout autre module ayant des capacités de liaison série (Rx/Tx). Il faut bien sûr une carte SD qui contienne les fichiers sonores MP3.
Merci à Christian de nous avoir fait découvrir ce petit circuit que nous emploierons bientôt dans nos décors.
samedi 7 janvier 2023
Commande PWM pour les trains
Un petit système de commande peut s'avérer bien utile pour piloter des trains. Jusqu'à présent, on s'oriente souvent vers une solution électronique mettant en œuvre le principe de modulation de largeur d'impulsions (PWM) car cela est fiable et bien adapté aux motorisations récentes des locomotives. Les schémas de principe disponibles sont nombreux (y compris avec Arduino) pour réaliser soi-même le montage, mais encore une fois l'intégration de l'électronique apporte une solution toute faite imbattable.