Con questo esperimento voglio testare le capacità di un HMI Weintek come monitor per un videogioco arcade.
Per iniziare svilupperei il prototipo in C / Raylib: una semplice pallina che rimbalza sullo schermo. Lo schermo ha la medesima larghezza e altezza dello HMI Weintek MT8050ie, quindi px 480 x 272.
L’obiettivo è riuscire a visualizzare sullo shermo dello HMI –per ora– questa semplice realtà.

il framerate nella realtà è molto più alto (60 fps)
Il sorgente C / Raylyb si può scaricare da questo link.
Ora viene la parte interessante: questo sorgente in C va convertito in uno sketch compatibile conArduino UNO. Al momento non è prevista l’interazione dell’utente. Arduino dovrà comunicare con l’HMI tramite il protocollo Modbus.
Ecco lo schema di massima.

Raylib offre già delle funzioni 2D e 3D che operano sui vettori (matematici), dovrò convertire quelle che vengono utilizzate nel sorgente raylibBouncingBallVector2.c per adattarle allo sketch Arduino.

Prima di tutto avremo necessità di queste librerie:
#include <LibPrintf.h>
#include <SoftwareSerial.h>
#include <ModbusRTUSlave.h>
- LibPrintf.h è una libreria avanzata per stampare sulla console (che ricalca printf() della standard library del linguaggio C).
- SoftwareSerial.h è necessaria per la comunicazione seriale.
- ModbusRTUSlave.h è la libreria che si occupa del protocollo Modbus.
Definiamo i parametri di comunicazione Modbus.
static const uint8_t SLAVE_ID = 1;
static const uint32_t BAUD = 9600;
SoftwareSerial rs232(10, 11); // RX, TX (Modbus su RS232)
ModbusRTUSlave modbus(rs232); // <-- FIX: costruttore con Stream
Definiamo 3 Holding Register:
- 1 per lo stato (l’elemento visualizzato a schermo sarà una lampada a Word, associata a un oggetto animazione);
- 1 per il valore dell’asse x;
- 1 per il valore dell’asse y.
uint16_t holding[3];
Definiamo le costanti:
const int screenWidth = 480;
const int screenHeight = 272;
const float radius = 10.0;
Allochiamo una variabile per il calcolo del Delta Timing:
float dt;
Definiamo la struct per la gestione della posizione della pallina e i calcoli sui vettori 2.
struct Vector2 {
float x;
float y;
} pos, vel;
Vector2 Vec2Add (Vector2, Vector2);
Vector2 Vec2Scale (Vector2, float);
Vector2 Vec2Sub (Vector2, Vector2);
Vector2 Vec2Reflect(Vector2, Vector2);
float Vec2Dot (Vector2, Vector2);
Definiamo le tre funzioni principali:
void updatePhysics (unsigned long);
void printDebugData (unsigned long);
void modbusPoll (unsigned long);
Ecco in linea di massima a cosa servono:
- updatePhysics() aggiorna la posizione della pallina;
- printDebugData() invia sulla seriale dei dati per il debug;
- modbusPoll() si occupa dell’aggiornamento degli Holding Register e della comunicazione Modbus.
Perché viene passato unsigned long come argomento queste funzioni?
Non voglio usare la funzione sleep(). Viene passato come argomento un valore in millisecondi che definisce l’intervallo di esecuzione della funzione.
Per ulteriori informazioni rimando a questo link: How-to-Run-Several-Tasks-on-an-Arduino.
Inizializzo quindi i parametri nel setup:
void setup() {
pos.x = screenWidth * 0.5;
pos.y = screenHeight * 0.5;
vel.x = 240.0;
vel.y = 170.0;
Serial.begin(9600);
rs232.begin(BAUD); // linea Modbus
modbus.configureHoldingRegisters(holding, 3);
modbus.begin(SLAVE_ID, BAUD, SERIAL_8N1);
holding[1] = (int)pos.x;
holding[2] = (int)pos.y;
}
Il codice contenuto nel loop è quindi molto semplice. Notare che i millisecondi passati come argomento alle funzioni sono impostati su numeri primi.
void loop() {
updatePhysics(51);
modbusPoll(103);
printDebugData(199);
}
La verifica del sorgente dà esito positivo (c’è eventuale spazio per ulteriori implementazioni, ma per ora ci fermiamo qui).
Sketch uses 17602 bytes (54%) of program storage space. Maximum is 32256 bytes.
Global variables use 546 bytes (26%) of dynamic memory, leaving 1502 bytes for local variables. Maximum is 2048 bytes.
Una volta caricato lo sketch, prima ancora di passare al progetto Weintek EasyBuilder è possibile verificare i valori di x e y della pallina tramite il serial monitor e il serial plotter di Arduino IDE.

Tramite il software ModbusPoll è possibile verificare i valori effettivi degli Holding Register (una nota: nel video sottostante ho valorizzato gli Holding Register n. 0 e 1; nel progetto definitivo vengono valorizzati gli Holding Register 0, 1 e 2).
È quindi possibile creare un nuovo progetto in EasyBuilder. Si può usare come base quello riportato in un mio precedente articolo (Modbus RTU su RS232 con Arduino – Bozzetti digitali).
La pagina 010 va modificata in questo modo:
- Va aggiunta una lampada word di dimensioni px 20 x 20 e va posizionata a x -10, y -10;
- La lampada deve leggere da HREG 0;
- A questa lampada va associata una movimentazione shape.



Dopodiché si può andare in simulazione on-line.
Il concetto generale quindi funziona.
La prossima implementazione ha già un nome: Super Modbus Bros.