Nell'SDK IDF ' contenuto un emulatore ESP32 QEmu
Non si possono simulare sensori e protocolli di trasmissione ma per cose semplici come REPL sulla seriale funziona piu' che bene
Non sono riuscito a fare partire l'emulatore con la finestra grafica
Nell'SDK IDF ' contenuto un emulatore ESP32 QEmu
Non si possono simulare sensori e protocolli di trasmissione ma per cose semplici come REPL sulla seriale funziona piu' che bene
Non sono riuscito a fare partire l'emulatore con la finestra grafica
Mi sono comprato una scheda per pilotare un NEMA 17 dalla Cina ed e' arrivata senza istruzioni. Per fortuna dopo un po' di ricerca ho trovato lo schema di connessione che peraltro abbastanza semplice
I motori stepper si dividono in closed loop e open loop: nel primo caso nel motore c'e' un encoder ottico che verifica il corretto posizionamento del motore anche in presenza di carichi che limitino il motore non perdendo passi
Il modulo A4988 non arriva montato ...deve essere inserito facendo coincidere il pin VIN (ultimo in basso fila di sinistra del connettore rosso centrale)
![]() |
| https://docs.google.com/document/d/e/2PACX-1vTyiIMFXQ1cY5TMhOh_0EjdznmC3Nw6CplW7Xx8F61ogOaUpHVyuaXsqrWhIiuE8SjpbON_VzB-rk3R/pub |
Nello sketch che segue viene eseguita anche una accelerazione e decelerazione in partenza ed arrivo (valore di ramp), usando il delayMin viene gestita la velocita' (in pratica l'intervallo tra gli impulsi)
/*
* Stepper motor control with A4988 driver
* Includes acceleration/deceleration ramp
* Speed controlled by potentiometer on A0
*/
#define enablePin 6 // Enable (LOW = ON)
#define dirPin 4 // Direction
#define stepPin 5 // Step
#define potPin A0 // Potentiometer input
const int stepsPerRevolution = 200; // 1.8° per step motor
// Motion control variables
int delayMin; // Minimum delay between steps (fastest speed)
int delayMax = 2000; // Maximum delay (slowest speed)
int rampSteps = 50; // Number of steps to accelerate/decelerate
void setup() {
pinMode(enablePin, OUTPUT);
pinMode(stepPin, OUTPUT);
pinMode(dirPin, OUTPUT);
pinMode(potPin, INPUT);
digitalWrite(enablePin, LOW); // Enable driver
digitalWrite(dirPin, HIGH); // Initial direction
}
void loop() {
// Read potentiometer to set minimum delay (speed)
int potValue = analogRead(potPin);
delayMin = map(potValue, 0, 1023, 2000, 200); // slower -> faster
// Rotate forward
digitalWrite(dirPin, HIGH);
moveStepper(stepsPerRevolution, delayMin);
delay(500); // pause
// Rotate backward
digitalWrite(dirPin, LOW);
moveStepper(stepsPerRevolution, delayMin);
delay(500);
}
//--------------------------------------------
// Function to move stepper with accel/decel
//--------------------------------------------
void moveStepper(int steps, int delayMin) {
for (int i = 0; i < steps; i++) {
int currentDelay;
// Acceleration phase
if (i < rampSteps)
currentDelay = map(i, 0, rampSteps, delayMax, delayMin);
// Deceleration phase
else if (i > steps - rampSteps)
currentDelay = map(i, steps - rampSteps, steps, delayMin, delayMax);
// Constant speed
else
currentDelay = delayMin;
// Step pulse
digitalWrite(stepPin, HIGH);
delayMicroseconds(currentDelay);
digitalWrite(stepPin, LOW);
delayMicroseconds(currentDelay);
}
}
Attenzione: dopo aver flashato un programma che usa OTG si perde la seriale USB, il dispositivo deve essere quindi resettato prima di poter essere riprogrammato
Da notare che in StampS3 il tasto e' nascosto sotto l'adesivo
------------------------------------------------------------------
Ho provato ad usare la porta USB in modalita' OTG in ESP32-S3
Con il modulo Esp32-S3-Wroom esistono due porte USB di cui una di programmazione (a sinistra) ed una OTG (a destra)
Provando gli esempi in examples/peripherals/usb/device/hid tutto funziona, la scheda viene riconosciuta come un device. Il problema e' che usando gli esempi examples/peripherals/usb/host/hid il dispositivo viene flashato in modo correto ma non funziona
Dopo averle provate tutto ho trovato che la seconda porta USB non porta corrente ma solo dati ...in pratica in modalita' host il dispositivo nemmeno di accende/ Ho provato una alimentazione esterna sul pin 5V e GND ma niente
Usando pero' dispositivi che hanno una batteria interna (tipo Cardputer basato su Esp32S3) il programma funziona...non riesco a trovare lo schema elettrica del Wroom a questo punto credo che non ci sia proprio connessione elettrica di alimentazione sull'USB Otg ma solo D+ e D-
Anche la Esp32S3 Feather alimentata via LiPo non alimenta in modo efficace la USb (i 3.7 V della Lipo non passano attraverso un booster)
per fornire 5V alla porta USB (e per alimentare nello stesso tempo la scheda) si stacca la LiPo si alimenta dall'esterno sul pin USB +5V e sul pin GND
In altri schede si deve collegare due piazzole come nella scheda sottostante per avere alimentazione su OTG
Volevo unire un progetto degli esempi dell'SDK IDF con la libreria M5Unified e mi sono accorto che non e' cosi' banale in quanto gli esempi sono scritti in C mentre M5Unified e' in C++
Si puo' ovviare creando un wrapper
idf.py create-project m5stick_test
idf.py add-dependency "m5stack/m5unified"
nel folder main si creano i file m5_wrapper.c e m5_wrapper.h
m5_wrapper.c
m5_wrapper.c
a questo punto si modifica il file CMakeLists.txt aggiungendo il file m5_wrapper.cpp
CMakeLists.txt
nel programma main.c si include l'header
e poi si inizializza
idf.py -p /dev/ttyUSB0 -b 115200 flash monitor
Sarebbe stato troppo funzionasse come questo
i valori dello sterzo sono sull'asse Z vanno da 0 (tutto a sinistra) a 65535 (tutto a destra) con il valore centrale quando lo sterzo e' al centro
Sempre dal libro del post precedente generazione di alberi frattali con algoritmo di Tokunaga
Sto leggendo Fractals and Chaos in Geology and Geophysics 2nd edition -- Donald Lawson Turcotte -- 2nd ed_, Cambridge, U_K, New York, England, 1997
Molto interessante anche se un po' e' passato di moda come argomento (se ne parlava molto a cavallo anni 90/00). Questo tipo di frattali che assomiglia agli ossidi di manganese nelle fratture delle rocce sono comunque affascinanti
![]() |
| https://thumbs.dreamstime.com/b/minerali-dentritici-degli-ossidi-del-manganese-e-del-ferro-71827942.jpg |
Ci avevo provato qui ma non era andato bene (solo Arduino era ok)..ci riprovo adesso con il dispositivo fisico
Attenzione: la scheda Arbotix deve essere gia' montato lo sketch ROS (vedi post precedente)
Per prima cosa si crea nella propria home
mkdir ~/ws_catkin
mkdir ~/ws_catkin/src
xhost +local:dockerpoi si lancia il docker (immagine completa di No Etic)
sudo docker run -it --net=host --env="DISPLAY=$DISPLAY" --env="QT_X11_NO_MITSHM=1" --env="XAUTHORITY=$XAUTH" --volume="/tmp/.X11-unix:/tmp/.X11-unix:rw" --volume="$HOME/ws_catkin:/root/ws_catkin:rw" --device=/dev/ttyUSB0:/dev/ttyUSB0 --privileged --name ros_noetic_gui osrf/ros:noetic-desktop-full
per testare si usa il simulatore turtle
roscore&
rosservice call /elbow_pitch_joint/enable "data: true"
rostopic echo /joint_states
In questo post ho voluto provare a leggere i valori in uscita da un Logitech G920 Racing Wheel
il volante si presenta in USB con ID 046d:c262 ed e' un dispositivo HID
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 002: ID 1199:9079 Sierra Wireless, Inc. EM7455
Bus 001 Device 003: ID 8087:0a2b Intel Corp. Bluetooth wireless interface
Bus 001 Device 004: ID 04ca:7066 Lite-On Technology Corp. Integrated Camera
Bus 001 Device 006: ID 046d:c262 Logitech, Inc. G920 Driving Force Racing Wheel
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Per leggere i messaggi HID si puo' semplicemente lancia
luca@nemo:~$ sudo usbhid-dump -d 046d:c262 -e all
CC001:012:000:DESCRIPTOR 1762351342.982709
05 01 09 04 A1 01 A1 02 85 01 15 00 25 07 35 00
46 3B 01 65 14 09 39 75 04 95 01 81 42 65 00 25
01 45 01 05 09 19 01 29 12 75 01 95 12 81 02 95
02 81 01 27 FF FF 00 00 47 FF FF 00 00 05 01 09
30 75 10 95 01 81 02 26 FF 00 46 FF 00 09 31 09
32 09 35 75 08 95 03 81 02 25 01 45 01 06 09 FF
19 01 29 03 75 01 95 03 81 02 95 05 81 01 C0 C0
06 43 FF 0A 02 06 A1 01 85 11 75 08 95 13 15 00
26 FF 00 09 02 81 00 09 02 91 00 C0 06 43 FF 0A
04 06 A1 01 85 12 75 08 95 3F 15 00 26 FF 00 09
04 81 00 09 04 91 00 C0
001:012:000:STREAM 1762351342.991209
01 0F 00 00 11 80 FF FF FF 07
001:012:000:STREAM 1762351344.926453
01 0F 00 00 11 80 F1 FF FF 07
001:012:000:STREAM 1762351344.936386
01 0F 00 00 11 80 DD FF FF 07
001:012:000:STREAM 1762351344.946409
01 0F 00 00 11 80 C5 FF FF 07
come si vede i messaggi hanno 10 byte (almeno nella versione PC/XBox che possiedo)
i valori della rotazione del volante sono nei byte 5 e 6 sono big endian e vanno da 0 con il volante tutto a sinistra (rotazione di 450 gradi a sinistra) a 65535 con il volante tutto a destra (rotazione di 450 gradi a destra). La posizione neutra e' 32789 (almeno nella mia calibrazione)
echo $(( 0x$f6 * 256 + 0x$f5 ))
il valore dell'acceleratore sul byte 7 con valore FF a pedale rialzato
il valore del freno e' sul byte 8 con valore FF a freno rilasciato
In caso di nuvole di punti o mesh molto numerose puo' essere molto lento il caricamento di tutto il tema via interfaccia web ed esiste la possibilita' di fare caricamenti progressivi basati sulla distanza del punto di vista...in questo caso pero' i dati devono essere preparati in modo idoneo
POINTCLOUD
git clone https://github.com/potree/PotreeConverter.git
cd PotreeConverter
mkdir build && cd build
cmake ..
make -j4
MESH
# Clone the main gltfpack repository
git clone https://github.com/zeux/meshoptimizer.git gltfpack_source
cd gltfpack_source
# Clone the required basis_universal fork (for KHR_texture_basisu support)
git clone -b gltfpack https://github.com/zeux/basis_universal basis_universal
# Clone libwebp (for WebP support)
git clone https://github.com/webmproject/libwebp libwebp
ABSOLUTE_PATH_ROOT=$(pwd)/..
cmake .. \
-DMESHOPT_BUILD_GLTFPACK=ON \
-DMESHOPT_GLTFPACK_BASISU_PATH="${ABSOLUTE_PATH_ROOT}/basis_universal" \
-DMESHOPT_GLTFPACK_LIBWEBP_PATH="${ABSOLUTE_PATH_ROOT}/libwebp"
make
make install
gltfpack -i model.glb -o model_lods.glb -cc -tc -si 0.5 -si 0.25 -si 0.1
A seguito di questo post ho provato a vedere ho provato a vedere cosa accadeva ad utilizzare un modello specifico per la lingua italiana in...