embassy-ssd1306-physics
Dessins 2D no_std d'objets physiques pour écrans OLED SSD1306 (128×64),
construite au-dessus de embassy-ssd1306-graphics.
Objets disponibles
| Module | Struct(s) | Description |
|---|---|---|
robotic_arm |
RoboticArm |
Bras robotique 2 segments (épaule + coude) |
pendulum |
Pendulum |
Pendule simple (pivot + tige + masse) |
spring_mass |
SpringMass |
Système ressort-masse vertical (zigzag + bloc) |
compass |
Compass |
Boussole (cadran + cardinaux + aiguille) |
gear |
Gear, GearPair, GearTrain |
Engrenages simples, paires et trains |
draw_utils |
(interne) | Primitives partagées (segment, arc, disque…) |
Ajouter au projet
[]
= "0.6"
= "0.1"
= "0.2"
= "0.1"
= "1.0"
Patron sin/cos injecté
Chaque draw() accepte cos_fn: fn(f32) -> f32 et sin_fn: fn(f32) -> f32.
Passez vos fonctions trig no_std favorites — zéro couplage, zéro overhead :
use embedded_trig_f32 as trig;
arm.draw;
Structure des modules
src/
├── lib.rs ← déclarations + re-exports
├── draw_utils.rs ← segment, arc, disque, rect (partagés)
├── robotic_arm.rs ← RoboticArm
├── pendulum.rs ← Pendulum
├── spring_mass.rs ← SpringMass
├── compass.rs ← Compass
└── gear.rs ← Gear · GearPair · GearTrain
Ajouter un nouvel objet
- Créer
src/mon_objet.rs - Déclarer
pub mod mon_objet;danssrc/lib.rs - (Optionnel)
pub use mon_objet::MonObjet;pour re-export
Aucun autre fichier à toucher.
Exemples
Bras robotique
use RoboticArm;
use embedded_trig_f32 as trig;
let arm = new;
// Épaule à 45°, coude à -30° relatif
arm.draw;
Pendule
use Pendulum;
use embedded_trig_f32 as trig;
let pend = new;
pend.draw; // ~23° à droite
Ressort-masse
use SpringMass;
let sm = new;
// Ressort étiré de 6px
sm.draw;
// Ressort comprimé de 4px
sm.draw;
// Personnalisation : 8 demi-spires, amplitude ±6px
let sm2 = new.with_coils;
sm2.draw;
Boussole
use Compass;
use embedded_trig_f32 as trig;
let compass = new;
compass.draw; // NE
Engrenage simple
use Gear;
use embedded_trig_f32 as trig;
// cx cy pitch_r teeth tooth_h tooth_w% hub_r
let g = new;
g.draw;
Paire d'engrenages
use ;
use embedded_trig_f32 as trig;
let pair = new;
let mut angle: f32 = 0.0;
loop
Train de 3 engrenages
use ;
use embedded_trig_f32 as trig;
let train = new;
train.draw;
Géométrie des engrenages
┌─┐ ┌─┐ ┌─┐ ← sommet (pitch_r + tooth_h)
──┘ └─┘ └─┘ └──
/ \
│ ┌──────┐ │ ← cercle primitif (pitch_r)
│ │ ◎ │ │ ← moyeu (hub_r)
│ └──────┘ │
\ /
──┐ ┌─┐ ┌─┐ ┌──
└─┘ └─┘ └─┘
Rapport de transmission GearPair / GearTrain
ω2 = -ω1 × (teeth1 / teeth2)
ω3 = ω1 × (teeth1 / teeth2) × (teeth2 / teeth3) [GearTrain]
La mise en phase est automatique : les dents se croisent proprement au point de contact.
Architecture
┌─────────────────────────────────────────────────┐
│ Votre application │
│ RoboticArm / Pendulum / Gear / GearPair … │
└──────────────────────┬──────────────────────────┘
│ &mut Graphics
┌──────────────────────▼──────────────────────────┐
│ embassy-ssd1306-physics │
│ robotic_arm · pendulum · spring_mass │
│ compass · gear (Gear / GearPair / GearTrain) │
│ ↓ draw_utils │
│ segment · arc · ring · filled_disk · rect │
└──────────────────────┬──────────────────────────┘
│ line() / circle() / fill_circle()
┌──────────────────────▼──────────────────────────┐
│ embassy-ssd1306-graphics │
│ clipping · pixel() │
└──────────────────────┬──────────────────────────┘
│ draw_pixel()
┌──────────────────────▼──────────────────────────┐
│ embassy-ssd1306 (driver) │
│ framebuffer · I2C · flush() │
└─────────────────────────────────────────────────┘
Disposition suggérée sur 128×64
┌────────────────────────────────────────────────────────────────┐
│ RoboticArm (x 0–55) │ GearPair (x 56–95) │ Pendule │ Boussole │
│ base=(20,50) │ g1=(66,32) r=10 │ (104,6) │ (120,32) │
│ seg1=28 seg2=18 │ g2=(84,32) r=8 │ l=20 │ r=10 │
└────────────────────────────────────────────────────────────────┘
Convention des angles
| Objet | Référence 0 | Sens positif |
|---|---|---|
RoboticArm |
Horizontal droit (X+) | Horaire (vers Y+) |
Pendulum |
Verticale (repos en bas) | Droite |
Compass |
Nord (Y–) | Horaire (Est) |
Gear |
X+ horizontal | Horaire |
SpringMass |
Sans angle | Extension vers Y+ |
Licence
GNU GPL v2 ou ultérieure — voir LICENSE.
Copyright (C) 2026 Jorge Andre Castro