Hardware components | ||||||
| × | 1 | ||||
| × | 10 |
In recent years I have been interested in kinetic sculptures such as those that can be seen in Changi Airport or those of Reuben Margolin.
Pretty soon, I realized that this kind of kinetic sculpture take up too much space to expose them in a small pieces.
I stumbled upon a video in which the author made a bench test of the strength of a cocktail umbrella. (https://youtu.be/Majo-WfhweA) This allowed me to validate my project.
So I used an Arduino Mega, an SD card reader, an LED display, and 10x Adafruit 16-channel servo drivers.
A lot of patience, programming. There you go.
The link to this achievement: https://youtu.be/HLPnubZ9jh8
////***********************************************************
//programme d'actionnement de 160 servomoteurs
// avril 2018
//Alain Haerri
//***********************************************************/
#include <SPI.h>// librairie de transmission serie
#include <SD.h>// librairie pour carte SD
#include "LcDef.h"// definition des lettres
#include <Wire.h>// pour le 16 channel servo
#include <Adafruit_PWMServoDriver.h>// pour le 16 channel servo
#include <LiquidCrystal.h>// pour le LCD afficheur
//***********************************************************/
// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(4, 6, 9, 11, 12, 13);
//********************
File myFile;// myFile=le fichier qu'on va lire sur la carte SD qui contient les valeurs 20;320;90; etc
//********************
// initialize les 10 cartes 16 chanel servos
Adafruit_PWMServoDriver pwm1 = Adafruit_PWMServoDriver(0x40);
Adafruit_PWMServoDriver pwm2 = Adafruit_PWMServoDriver(0x41);
Adafruit_PWMServoDriver pwm3 = Adafruit_PWMServoDriver(0x42);
Adafruit_PWMServoDriver pwm4 = Adafruit_PWMServoDriver(0x43);
Adafruit_PWMServoDriver pwm5 = Adafruit_PWMServoDriver(0x44);
Adafruit_PWMServoDriver pwm6 = Adafruit_PWMServoDriver(0x45);
Adafruit_PWMServoDriver pwm7 = Adafruit_PWMServoDriver(0x46);
Adafruit_PWMServoDriver pwm8 = Adafruit_PWMServoDriver(0x47);
Adafruit_PWMServoDriver pwm9 = Adafruit_PWMServoDriver(0x48);
Adafruit_PWMServoDriver pwm10 = Adafruit_PWMServoDriver(0x49);
Adafruit_PWMServoDriver servoligne[10] {pwm10,pwm9,pwm8,pwm7,pwm6,pwm5,pwm4,pwm3,pwm2,pwm1}; //creation d'un tableau servoligne qui contient pwm1,pwm2 etc
// on a 10 lignes de 16 colonnes = 160 servos mais il faudra 25 amperes !!! 125W
int degremin=40;
int degremax=120;
int valeurmax=map(degremax,0,180,150,550);// pour limiter les mouvements de 40 à 130 degrés 150,550 sont les valeurs min et max a donner auxservos pour 0 et 180 degrés
int valeurmin=map(degremin,0,180,150,550);// pour limiter les mouvements de 40 à 130 degrés 150,550 sont les valeurs min et max a donner auxservos pour 0 et 180 degrés
// cela donne 238 valeurmin et 483 valeurmax ce sont les valeurs limite de 40 à 130 degré,
// si on diminue valeurmin ou on augmentvaleuxmax ça rique de casser les parasols
int tabvaleurmin[10][16];//tableau de réglages de chaque servos de l'angle 0 (+- 150)
int tabvaleurmax[10][16];//tableau de réglages de chaque servos de l'angle 180(+- 550)
int angleconsigne=degremin;
// definition de 4 boutons(return,+,-;valider)
#define bouton1on (!digitalRead(24))
#define bouton2on (!digitalRead(26))
#define bouton3on (!digitalRead(28))
#define bouton4on (!digitalRead(30))
byte bouton1onprevious=0;
byte bouton2onprevious=0;
byte bouton3onprevious=0;
byte bouton4onprevious=0;
int valeurbouton1=0;
int valeurbouton2=0;
int valeurbouton3=0;
int valeurbouton4=0;
byte ausuivant=0;
int prochainecol=0;// utilisé dans lettre
int angle[10 ] [ 16];//= {// a garder pour le moment mais sera different après , un fichier apar angle voulu,le fichier contient un tableau de 16x8 angle de servo
//***********************************************************************************************
//******************************* SET UP *******************************************
//***********************************************************************************************
void setup()
{
pinMode(24,INPUT_PULLUP);
pinMode(26,INPUT_PULLUP);
pinMode(28,INPUT_PULLUP);
pinMode(30,INPUT_PULLUP);
for (int x=0;x<=9;x++)// 10 colonnes
{
servoligne[x].begin();
servoligne[x].setPWMFreq(60); // This is the maximum PWM frequency
}
lcd.begin(16, 2); // set up the LCD's number of columns and rows:
Serial.begin(9600);
delay(1000);//wait for a second
randomSeed(analogRead(0));
for(int y=0;y<=9; y++) {// pour toutes les lignes de servos`tableau de réglages de chaque servos
for( int x=0;x<=15;x++) {// pour toutes les colonnes de servos
tabvaleurmin[y][x]=150;//pour au moins avoir ça et pas des 0
tabvaleurmax[y][x]=550; //pour au moins avoir ça et pas des 0
}
}
//********************carte sd initilaisation********************
Serial.print("Initializing SD card...");//
lcdaffiche("Initializing SD card...","");
if (!SD.begin(53)) {// *
Serial.println("initialization failed!");//
lcdaffiche("carte SD pas OK","");
delay(4000);
//return;// *
}//
else{//*
Serial.println("initialization done.");//
lcdaffiche("carte SD OK","");
delay(4000);
//******************** fin initilaisaton carte sd***********************************
lecturecartesd("tabmin.txt",tabvaleurmin);// pour toutes les lignes de servos`tableau de réglages de chaque servos memoriser sur la carte SD
lecturecartesd("tabmax.txt",tabvaleurmax);// pour toutes les lignes de servos`tableau de réglages de chaque servos memoriser sur la carte SD
}
}
//************************* LOOP ************************************************************************
//*********************************************************************************************************************
void loop()
{
reglage();
menu();
balle();
eclosion();
propagation();
mouvementsynchrone();//image
mouvementsinusoidal();//sinusoide
mouvementsinusimage();//image avec sinusoide
lettre("HELLO[[[");//lettre le [ pour faire un espace code ascii 91
if(quelboutonpese()==4){menu();}
}
Comments