9 Commits

Author SHA1 Message Date
arthur L
f28134bcd7 Merge remote-tracking branch 'refs/remotes/origin/master'
Conflicts:
	Hello
2016-03-03 21:03:56 +01:00
arthur L
7ee520b8e5 Test arthur 2 2016-03-03 20:55:48 +01:00
arthur L
40deb5d84e Modif test arthur 2016-03-03 20:55:27 +01:00
xctd692
7b91fc14dd Mise au propre du code YATA 2016-03-03 17:34:36 +01:00
66ae35ea13 Driver_Moteur_DC première impression viable
YATA :)
2016-03-03 02:06:03 +01:00
Thomas Sablé
c9ba9f7ffb Création de branche "Modification du corps" 2016-03-02 19:41:28 +01:00
Thomas Sablé
8dcd4f0831 --- 2016-03-02 19:39:26 +01:00
Thomas Sablé
63a6cd03b5 deuxième tentative... 2016-03-02 19:38:33 +01:00
Thomas Sablé
8b60845b49 tentative de création d'une branche ... --'
désésspoir
2016-03-02 19:37:43 +01:00
95 changed files with 460 additions and 0 deletions

1
Modification_du_corps/README Executable file
View File

@@ -0,0 +1 @@
Comming soon ...

0
Moteur DC/Arduino-PID-AutoTune-Library/README.txt Normal file → Executable file
View File

0
Moteur DC/DC_servo/DC_1servo.7z Normal file → Executable file
View File

0
Moteur DC/DC_servo/DC_1servo/DC_1servo.ino Normal file → Executable file
View File

0
Moteur DC/DC_servo/DC_1servo/PID_v1.cpp Normal file → Executable file
View File

0
Moteur DC/DC_servo/DC_1servo/PID_v1.h Normal file → Executable file
View File

View File

0
Moteur DC/ServoStrap/LICENSE Normal file → Executable file
View File

0
Moteur DC/ServoStrap/README.md Normal file → Executable file
View File

View File

View File

@@ -0,0 +1,229 @@
#include <digitalWriteFast.h>
//this is to use DWF library, it will increase the speed of digitalRead/Write command
//used in the interrupt function doEncoderMotor0, but may be used everywhere.
/*
https://github.com/danithebest91/ServoStrap
i have made this code for the LMD18245 motor controller,
i have merged the pid code of Josh Kopel
whith the code of makerbot servo-controller board,
you can use this code on the some board changing some values.
Daniele Poddighe
external ardware require a quadrature encoder, timing slit strip and a dc motor,
all you can find inside an old printer, i have took it from canon and hp printers(psc1510)
for motor controll you can choose different type of H-bridge, i have used LMD18245,
you can order 3 of it on ti.com sample request, the hardware needed is explained on the datasheet but i'm drowing
the schematic and PCB layout on eagle.
read a rotary encoder with interrupts
Encoder hooked up with common to GROUND,
encoder0PinA to pin 2, encoder0PinB to pin 4 (or pin 3 see below)
it doesn't matter which encoder pin you use for A or B
is possible to change PID costants by sending on serial interfaces the values separated by ',' in this order: KP,KD,KI
example: 5.2,3.1,0 so we have KP=5.2 KD=3.1 KI=0 is only for testing purposes, but i will leave this function with eeprom storage
This code use Port manipulation :
Port registers allow for lower-level and faster manipulation of the i/o pins of the microcontroller on an Arduino board. The chips used on the Arduino board
(the ATmega8 and ATmega168) have three ports:
B (digital pin 8 to 13)
C (analog input pins)
D (digital pins 0 to 7)
https://www.arduino.cc/en/Reference/PortManipulation
https://www.arduino.cc/en/Hacking/PinMapping
https://www.arduino.cc/en/Hacking/PinMapping168
*/
#define encoder0PinA 2 // PD2 (INT0) You can't modify port mapping here because this code use Port manipulation (I2)
#define encoder0PinB 8 // PB0; (I8)
#define MotorIN1 5 //(I5) IN1
#define MotorIN2 6 //(I6) IN2
//from ramps 1.4 stepper driver
#define STEP_PIN 3 //PD3 (INT1) (I3)
#define DIR_PIN 14 //PC0; (A0)
#define X_MIN 4 //(4)
volatile long encoder0Pos = 0;
long target = 0;
long target1 = 0;
int StartRoutine=0;
//correction = Kp * error + Kd * (error - prevError) + kI * (sum of errors)
//PID controller constants
float KP = 2.25 ; //position multiplier (gain) 2.25
float KI = 0.25; // Intergral multiplier (gain) .25
float KD = 1.0; // derivative multiplier (gain) 1.0
int lastError = 0;
int sumError = 0;
//Integral term min/max (random value and not yet tested/verified)
int iMax = 100;
int iMin = 0;
long previousTarget = 0;
long previousMillis = 0; // will store last time LED was updated
long interval = 5; // interval at which to blink (milliseconds)
//for motor control ramps 1.4
bool newStep = false;
bool oldStep = false;
bool dir = false;
void setup() {
pinModeFast(2, INPUT);
pinModeFast(encoder0PinA, INPUT);
pinModeFast(encoder0PinB, INPUT);
pinModeFast(X_MIN, INPUT);
pinModeFast(MotorIN1, OUTPUT);
pinModeFast(MotorIN2, OUTPUT);
//ramps 1.4 motor control
pinModeFast(STEP_PIN, INPUT);
pinModeFast(DIR_PIN, INPUT);
attachInterrupt(0, doEncoderMotor0, CHANGE); // encoder pin on interrupt 0 - pin 2
attachInterrupt(1, countStep, RISING); //on pin 3
Serial.begin (115200);
Serial.println("start"); // a personal quirk
}
void loop(){
while (Serial.available() > 0) {
KP = Serial.parseFloat();
KD = Serial.parseFloat();
KI = Serial.parseFloat();
Serial.println(KP);
Serial.println(KD);
Serial.println(KI);
}
Fstart();
if(millis() - previousTarget > 1000){ //enable this code only for test purposes because it loss a lot of time
if (X_MIN == LOW) Serial.print("LOW");
else Serial.print("HIGH");
Serial.print(',');
Serial.print(encoder0Pos);
Serial.print(',');
Serial.println(target1);
previousTarget=millis();
}
target = target1;
docalc();
}
void Fstart(){
if (StartRoutine == 0)
{
digitalWrite ( MotorIN1 , LOW );
analogWrite ( MotorIN2, 200 );
delay(2000);
digitalWrite ( MotorIN2 , LOW );
analogWrite ( MotorIN1, 255 );
delay(200);
digitalWrite ( MotorIN1, LOW );
analogWrite ( MotorIN2, 255 );
delay(180);
digitalWrite ( MotorIN2, LOW );
analogWrite ( MotorIN1, 255 );
delay(100);
digitalWrite ( MotorIN1, LOW );
analogWrite ( MotorIN2, 255 );
delay(90);
digitalWrite ( MotorIN2, LOW );
analogWrite ( MotorIN1, 255 );
delay(100);
digitalWrite ( MotorIN1, LOW );
analogWrite ( MotorIN2, 200 );
delay(2000);
StartRoutine = 1;
encoder0Pos=0;
}
}
void docalc() {
if (millis() - previousMillis > interval)
{
previousMillis = millis();
long error = encoder0Pos - target ; // find the error term of current position - target
//generalized PID formula
//correction = Kp * error + Kd * (error - prevError) + kI * (sum of errors)
long motorspeed = KP * error + KD * (error - lastError) +KI * (sumError);
lastError = error;
sumError += error;
//scale the sum for the integral term
if(sumError > iMax) {
sumError = iMax;
} else if(sumError < iMin){
sumError = iMin;
}
if(motorspeed > 0){
if( motorspeed >= 255) motorspeed=255;
digitalWrite ( MotorIN1 , LOW );
analogWrite ( MotorIN2, motorspeed );
}
if(motorspeed < 0){
motorspeed = -1 * motorspeed;
if( motorspeed >= 255) motorspeed=255;
digitalWrite ( MotorIN2 , LOW );
analogWrite ( MotorIN1, motorspeed );
//digitalWrite ( MotorIN1 , HIGH );
//analogWrite ( MotorIN2, 255 - motorspeed );
}
}
}
void doEncoderMotor0(){
//if (((PIND&B0000100)>>2) == HIGH) { // found a low-to-high on channel A; if(digitalRead(encoderPinA)==HIGH){.... read PD2 (I2)
if(digitalRead(encoder0PinA)==HIGH){
if ((PINB&B0000001) == LOW) { // check channel B to see which way; if(digitalRead(encoderPinB)==LOW){.... read PB0 (I8)
// encoder is turning
encoder0Pos-- ; // CCW
}
else {
encoder0Pos++ ; // CW
}
}
else // found a high-to-low on channel A
{
if ((PINB&B0000001) == LOW) { // check channel B to see which way; if(digitalRead(encoderPinB)==LOW){.... read PB0 (I8)
// encoder is turning
encoder0Pos++ ; // CW
}
else {
encoder0Pos-- ; // CCW
}
}
}
void countStep(){
//dir=digitalRead(DIR_PIN)==HIGH;
dir = (PINC&B0000001); // dir=digitalRead(dir_pin) read PC0, 14 digital;
//here will be (PINB&B0000001) to not use shift in the stable version
if (dir) target1++;
else target1--;
}

View File

@@ -0,0 +1,230 @@
#include <digitalWriteFast.h>
/*
Fortement inspiré du projet :
https://github.com/danithebest91/ServoStrap
is possible to change PID costants by sending on serial interfaces the values separated by ',' in this order: KP,KD,KI
example: 5.2,3.1,0 so we have KP=5.2 KD=3.1 KI=0 is only for testing purposes, but i will leave this function with eeprom storage
Utilisation de la librairies digitalWriteFast qui permet d'utiliser la manipulation de port pour accélérer les lectures écritures de certaine entree/sortie :
Port registers allow for lower-level and faster manipulation of the i/o pins of the microcontroller on an Arduino board. The chips used on the Arduino board
(the ATmega8 and ATmega168) have three ports:
B (digital pin 8 to 13)
C (analog input pins)
D (digital pins 0 to 7)
https://www.arduino.cc/en/Reference/PortManipulation
Petit rappel sur la puce arduino :
https://www.arduino.cc/en/Hacking/PinMapping
https://www.arduino.cc/en/Hacking/PinMapping168
*/
// --------------- INPUT ---------------------------------------------------
// Les ports de l'encoder sont 2 pour bénéficier de l'interuption sur A et 8 pour utiliser le PortManipulation. Attention sur le port manipulation à ne pas utiliser les pin 9 à 13 !
#define encoder0PinA 2 // PD2 (INT0)
#define encoder0PinB 8 // PB0; (I8)
// Utilisation de 5 et 6 pour la commande moteur via le driver L293D. Le enable est connecté au vcc et le pwm est envoyé directement dans les input.
#define MotorIN1 5 //(I5) IN1
#define MotorIN2 6 //(I6) IN2
// Recuperation des step de la carte avec interuption sur le port 3 et PortManipulation sur le port A0. Attention sur le port manipulation à ne pas utiliser les pin A1 à A5 !
#define STEP_PIN 3 //PD3 (INT1) (I3)
#define DIR_PIN 14 //PC0; (A0)
// Récupération du fin de course x_min pour l'initialisation du moteur
#define X_MIN 4 //(4)
// ------------------------------------------------------------------------
// ------------- CONSTANTE DU PID -------------
float KP = 5 ; //Porportionnel
float KI = 0.1; // Intergrale
float KD = 2.0; // derive
// ------------- CONSTANTE DU PID -------------
// Initialisation de la position encoder. Attention celle-ci est incrémenté via un CHANGE sur l'interuption 0. Le nombre de pas de la roue codeuse est donc double !
volatile long encoder0Pos = 0;
long target = 0;
long target1 = 0;
int lastError = 0;
int sumError = 0;
int StartRoutine=0;
//Integral term min/max (random value and not yet tested/verified)
int iMax = 100;
int iMin = 0;
long previousTarget = 0;
long previousMillis = 0; // will store last time LED was updated
long interval = 5; // interval at which to blink (milliseconds)
//for motor control ramps 1.4
bool newStep = false;
bool oldStep = false;
bool dir = false;
void setup() {
pinModeFast(2, INPUT);
pinModeFast(encoder0PinA, INPUT);
pinModeFast(encoder0PinB, INPUT);
pinModeFast(X_MIN, INPUT);
pinModeFast(MotorIN1, OUTPUT);
pinModeFast(MotorIN2, OUTPUT);
// Initailisation recuperation commande carte
pinModeFast(STEP_PIN, INPUT);
pinModeFast(DIR_PIN, INPUT);
// INTERUPTION
attachInterrupt(0, doEncoderMotor0, CHANGE); // encoder pin on interrupt 0 - pin 2
attachInterrupt(1, countStep, RISING); //on pin 3
// INTERUPTION
Serial.begin (115200);
Serial.println("start"); // a personal quirk
}
void loop(){
while (Serial.available() > 0) {
KP = Serial.parseFloat();
KD = Serial.parseFloat();
KI = Serial.parseFloat();
Serial.println(KP);
Serial.println(KD);
Serial.println(KI);
}
Fstart();
if(millis() - previousTarget > 1000){ //enable this code only for test purposes because it loss a lot of time
// if (X_MIN == LOW) Serial.print("LOW");
// else Serial.print("HIGH");
// Serial.print(',');
Serial.print(encoder0Pos);
Serial.print(',');
Serial.println(target1);
previousTarget=millis();
}
target = target1;
docalc();
}
void Fstart(){
//Fonction start joue une seul fois
// Devellopement de l'autotune en cours a intergrer au demarrage du moteur ainsi que le homing
if (StartRoutine == 0)
{
digitalWrite ( MotorIN1 , LOW );
analogWrite ( MotorIN2, 200 );
delay(2000);
digitalWrite ( MotorIN2 , LOW );
analogWrite ( MotorIN1, 255 );
delay(200);
digitalWrite ( MotorIN1, LOW );
analogWrite ( MotorIN2, 255 );
delay(180);
digitalWrite ( MotorIN2, LOW );
analogWrite ( MotorIN1, 255 );
delay(100);
digitalWrite ( MotorIN1, LOW );
analogWrite ( MotorIN2, 255 );
delay(90);
digitalWrite ( MotorIN2, LOW );
analogWrite ( MotorIN1, 255 );
delay(100);
digitalWrite ( MotorIN1, LOW );
analogWrite ( MotorIN2, 200 );
delay(2000);
StartRoutine = 1;
encoder0Pos=0;
}
}
void docalc() {
if (millis() - previousMillis > interval)
{
previousMillis = millis();
long error = encoder0Pos - target ; // find the error term of current position - target
//generalized PID formula
//correction = Kp * error + Kd * (error - prevError) + kI * (sum of errors)
long motorspeed = KP * error + KD * (error - lastError) +KI * (sumError);
lastError = error;
sumError += error;
//scale the sum for the integral term
if(sumError > iMax) {
sumError = iMax;
} else if(sumError < iMin){
sumError = iMin;
}
if(motorspeed > 0){
if( motorspeed >= 255) motorspeed=255;
digitalWrite ( MotorIN1 , LOW );
analogWrite ( MotorIN2, motorspeed );
}
if(motorspeed < 0){
motorspeed = -1 * motorspeed;
if( motorspeed >= 255) motorspeed=255;
digitalWrite ( MotorIN2 , LOW );
analogWrite ( MotorIN1, motorspeed );
//digitalWrite ( MotorIN1 , HIGH );
//analogWrite ( MotorIN2, 255 - motorspeed );
}
}
}
void doEncoderMotor0(){
//if (((PIND&B0000100)>>2) == HIGH) { // found a low-to-high on channel A; if(digitalRead(encoderPinA)==HIGH){.... read PD2 (I2)
if(digitalRead(encoder0PinA)==HIGH){
if ((PINB&B0000001) == LOW) { // check channel B to see which way; if(digitalRead(encoderPinB)==LOW){.... read PB0 (I8)
// encoder is turning
encoder0Pos-- ; // CCW
}
else {
encoder0Pos++ ; // CW
}
}
else // found a high-to-low on channel A
{
if ((PINB&B0000001) == LOW) { // check channel B to see which way; if(digitalRead(encoderPinB)==LOW){.... read PB0 (I8)
// encoder is turning
encoder0Pos++ ; // CW
}
else {
encoder0Pos-- ; // CCW
}
}
}
void countStep(){
//dir=digitalRead(DIR_PIN)==HIGH;
dir = (PINC&B0000001); // dir=digitalRead(dir_pin) read PC0, 14 digital;
//here will be (PINB&B0000001) to not use shift in the stable version
if (dir) target1++;
else target1--;
}

0
Moteur DC/ServoStrap/digitalWriteFast.h Normal file → Executable file
View File

0
Moteur DC/ServoStrap/keywords.txt Normal file → Executable file
View File

0
Moteur DC/Test/Test_Moteur_DC/Test_Moteur_DC.ino Normal file → Executable file
View File

0
Moteur DC/Test/Test_Roue_Codeuse/Test_Roue_Codeuse.ino Normal file → Executable file
View File

0
README Normal file → Executable file
View File

0
imprimante_3d_fablab/Imprimante_3d_fablab.SLDASM Normal file → Executable file
View File

View File

View File

0
imprimante_3d_fablab/pièces/NORDEX-ABX-C3-8.SLDPRT Normal file → Executable file
View File

0
imprimante_3d_fablab/pièces/Rexroth-Default.SLDPRT Normal file → Executable file
View File

0
imprimante_3d_fablab/pièces/Tasseau M6.SLDPRT Normal file → Executable file
View File

View File

0
imprimante_3d_fablab/pièces/axe charnière.SLDPRT Normal file → Executable file
View File

0
imprimante_3d_fablab/pièces/batant charnière.SLDPRT Normal file → Executable file
View File

View File

View File

View File

View File

View File

View File

View File

View File

View File

View File

View File

0
imprimante_3d_fablab/pièces/porte.SLDPRT Normal file → Executable file
View File

0
imprimante_3d_fablab/pièces/prof_40x40x300mm.SLDPRT Normal file → Executable file
View File

0
imprimante_3d_fablab/pièces/prof_40x40x600mm.SLDPRT Normal file → Executable file
View File

View File

0
imprimante_3d_fablab/pièces/support_plateau.SLDPRT Normal file → Executable file
View File

View File

View File

View File

View File

View File

View File

View File

View File

Before

Width:  |  Height:  |  Size: 273 KiB

After

Width:  |  Height:  |  Size: 273 KiB

View File

Before

Width:  |  Height:  |  Size: 115 KiB

After

Width:  |  Height:  |  Size: 115 KiB

View File

Before

Width:  |  Height:  |  Size: 117 KiB

After

Width:  |  Height:  |  Size: 117 KiB

View File

Before

Width:  |  Height:  |  Size: 166 KiB

After

Width:  |  Height:  |  Size: 166 KiB

View File

View File

View File

0
imprimante_3d_fablab/sous_assemblages/carcasse.SLDASM Normal file → Executable file
View File

0
imprimante_3d_fablab/sous_assemblages/charniere.SLDASM Normal file → Executable file
View File

0
imprimante_3d_fablab/sous_assemblages/couvercle.SLDASM Normal file → Executable file
View File

View File

View File

Before

Width:  |  Height:  |  Size: 166 KiB

After

Width:  |  Height:  |  Size: 166 KiB

View File

Before

Width:  |  Height:  |  Size: 122 KiB

After

Width:  |  Height:  |  Size: 122 KiB

0
imprimante_3d_fablab/vue_carcasse_13.11.2015.png Normal file → Executable file
View File

Before

Width:  |  Height:  |  Size: 150 KiB

After

Width:  |  Height:  |  Size: 150 KiB

View File

Before

Width:  |  Height:  |  Size: 115 KiB

After

Width:  |  Height:  |  Size: 115 KiB

View File

Before

Width:  |  Height:  |  Size: 226 KiB

After

Width:  |  Height:  |  Size: 226 KiB

0
imprimante_3d_fablab/vue_plateau_15.11.2015.png Normal file → Executable file
View File

Before

Width:  |  Height:  |  Size: 193 KiB

After

Width:  |  Height:  |  Size: 193 KiB