embassy-ssd1306-physics
Dessins 2D no_std d'objets physiques pour écrans OLED SSD1306 (128×64),
construite au-dessus de embassy-ssd1306-graphics.
Consultez les notes de version dans le CHANGELOG.md (version 0.3.0).
Objets disponibles
| Module | Struct(s) | Description |
|---|---|---|
robotic_arm |
RoboticArm, Facing |
Bras industriel 2D (socle + pince pneumatique) |
pendulum |
Pendulum |
Pendule simple (encastrement + tige + masse) |
piston |
Piston |
Piston 2D mécanique (chambre + tige guidée) |
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.3"
= "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;
Convention de repère et angles
Repère écran
(0,0) ──── X+
│
Y+ (Y croît vers le bas — convention écran standard)
Conventions angulaires par objet
RoboticArm — Angles depuis la verticale montante
L'angle est mesuré depuis la verticale montante (axe −Y) :
0°
↑
−90° ← → +90°
angle_shoulder: orientation absolue du segment 10.0→ segment droit vers le haut- positif → incliné vers le côté
Facing
angle_elbow: rotation relative du segment 2 par rapport au segment 10.0→ segments alignés (bras tendu)- positif → coude plié vers le côté
Facing
Pendulum — Angles depuis la verticale descendante
L'angle est mesuré depuis la verticale descendante (axe +Y) :
−90° ← 0° → +90°
↓
0.0→ pendule au repos (tige pend vers le bas)- positif → penche à droite
- négatif → penche à gauche
Piston — Position linéaire
Le piston se déplace verticalement (axe Y) dans sa chambre :
pos = 0 ← sommet (chambre fermée)
│
│ chambre
│
pos = max ← bas (piston complètement sortant)
pos ∈ [0, h − piston_h]: position contraintenormalized() ∈ [0.0, 1.0]: position normalisée (0 = haut, 1 = bas)
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
├── piston.rs ← Piston
├── 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
Bras industriel 2D à deux segments avec pince pneumatique.
L'angle est mesuré depuis la verticale montante (0 = droit vers le haut, positif = incliné selon Facing).
Architecture : socle industriel (rect + hachures) + pivot d'épaule + segment 1 + segment 2 + effecteur + pince à mâchoires.
Facing : énumération Right / Left qui contrôle l'orientation et le sens d'ouverture de la pince, attention Left la pince pointe a droite et Right la pince pointe a gauche .
Nouveautés RoboticArm
Facingpour inverser facilement l'orientation du bras , attention Left la pince pointe a droite et Right la pince pointe a gauche .with_wall()pour personnaliser le socle industrielwith_gripper()pour ajuster la taille de la pince- Convention angulaire clarifiée : angles mesurés depuis la verticale montante
Constructeur par défaut
use RoboticArm;
use embedded_trig_f32 as trig;
// Base à (64, 63), segment 1: 20px, segment 2: 18px
let arm = new;
// Épaule à 45°, coude à -30° relatif, pince fermée (0.0)
arm.draw;
// Même bras à gauche
arm.draw;
Socle et pince personnalisés
use ;
use embedded_trig_f32 as trig;
let arm = new
.with_wall // socle plus grand : 20×6
.with_gripper; // pince : 10px long, 2px hauteur
arm.draw;
Animation simple
use ;
use embedded_trig_f32 as trig;
let arm = new;
let mut angle_shoulder: f32 = 0.0;
let mut angle_elbow: f32 = 0.0;
loop
### Pendule
Pendule simple : pivot fixe + tige + masse circulaire.
**L'angle est mesuré depuis la verticale descendante** .
**Rendus :** encastrement mural + tige + pivot + masse .
#### Constructeur par défaut
```rust
use Pendulum;
use embedded_trig_f32 as trig;
// Pivot à (64, 6), tige 28px, encastrement par défaut 16×5
let pend = new;
pend.draw; // ~23° à droite
pend.draw; // ~23° à gauche
Encastrement personnalisé
use Pendulum;
use embedded_trig_f32 as trig;
// Encastrement plus grand : 20×8 au lieu de 16×5
let pend = with_wall;
pend.draw;
Animation simple
let mut angle: f32 = 0.0;
loop
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
Piston
use Piston;
let mut piston = new;
// Position au sommet (fermé)
piston.set_pos;
piston.draw;
// Position au milieu
piston.set_pos;
piston.draw;
// Animation simple : va-et-vient
let max_pos = piston.h - piston.piston_h;
let mut pos: i32 = 0;
loop
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 | Type |
|---|---|---|---|
RoboticArm |
Verticale montante (Y−) | Vers Facing |
Angulaire |
Pendulum |
Verticale descendante (Y+) | Droite | Angulaire |
Piston |
Sommet chambre (pos=0) | Vers le bas (Y+) | Linéaire |
Compass |
Nord (Y−) | Horaire (Est) | Angulaire |
Gear |
X+ horizontal | Horaire | Angulaire |
SpringMass |
— | Extension vers Y+ | Linéaire |
Licence
GNU GPL v2 ou ultérieure — voir LICENSE.
Copyright (C) 2026 Jorge Andre Castro