Estimation de la position d’un bot sur roues avec arduino. (3 / 5 étapes)

Étape 3: Le code source

Haaa enfin l’intéressant la partie;)

Il s’agit d’un exemple du code pour un arduino mega :
(N’oubliez pas de mettre vos propres valeurs dans TICK_PER_MM et diamètre
TICK_PER_MM est le nombre de graduations qui fait de votre codeur pour faire 1 millimètre sur le terrain)

/*
* ----------------------------------------------------------------------------
* "La bière-WARE licence" (révision 42) :
* JBot a écrit ce fichier. Tant que vous conservez cette remarque que vous
* peut faire tout ce que vous voulez avec ce genre de choses. Si nous rencontrons un jour et que vous pensez
* ça en vaut la peine, vous pouvez m’acheter une bière en retour.
* ----------------------------------------------------------------------------
*/

Autres comprend
#include < avr/io.h >
#include < util/delay.h >
#include < avr/interrupt.h >
#include < math.h >

/***********/
/ * Définit * /
/***********/
#define TICK_PER_MM_LEFT 90.9456817668
#define TICK_PER_MM_RIGHT 90.9456817668
#define diamètre 166,0 / / Distance entre les 2 roues (en millimètres)

#define TWOPI 6.2831853070
#define RAD2DEG 57.2958 / * radians en degrés conversion * /

/********************/
/ * Variables globales * /
/********************/
volatils long left_cnt = 0 ;
volatils long right_cnt = 0 ;

double pos_X = 0 ;
double pos_Y = 0 ;
double theta = 0 ;

int last_left = 0 ;
int last_right = 0 ;

int left_diff = 0 ;
int right_diff = 0 ;

double total_distance = 0.0 ;

/***********************/
/ * INTERRUPTION FONCTIONS * /
/***********************/

Routine de service externe 4 interrompre = > code PIN2
ISR(INT4_vect)
{
#asm("cli")
Si ((PINB & 0x10)! = 0) {}
Si ((PINE & 0x10)! = 0)
left_cnt--;
d’autre
left_cnt ++ ;
} else {}
Si ((PINE & 0x10) == 0)
left_cnt--;
d’autre
left_cnt ++ ;
}

#asm("sei")
}

Routine de service externe interrompre 5 = > broche 3
ISR(INT5_vect)
{
Si ((PINK & 0x80)! = 0) {}
Si ((PINE & 0x20)! = 0)
right_cnt ++ ;
d’autre
right_cnt--;
} else {}
Si ((PINE & 0x20) == 0)
right_cnt ++ ;
d’autre
right_cnt--;
}

}

Goupille changement 0-7 interrupt service routine = > PIN10
ISR(PCINT0_vect)
{
Si ((PINE & 0x10)! = 0) {}
Si ((PINB & 0x10)! = 0) {}
left_cnt ++ ;
} else
left_cnt--;
} else {}
Si ((PINB & 0x10) == 0) {}
left_cnt ++ ;
} else
left_cnt--;
}

}

Broche modifier la routine d’interruption du service 16-23 = > PIN-ADC15
ISR(PCINT2_vect)
{
Si ((PINE & 0x20)! = 0) {}
Si ((PINK & 0x80)! = 0)
right_cnt--;
d’autre
right_cnt ++ ;
} else {}
Si ((PINK & 0x80) == 0)
right_cnt--;
d’autre
right_cnt ++ ;
}

}

Routine de service de minuteur 1 débordement interruption
ISR(TIMER1_OVF_vect)
{
SEI() ; activer les interruptions
get_Odometers() ;

}

/*************************/
/ * INITIALISATION DU SYSTÈME * /
/*************************/
void setup()
{
Facteur de division Crystal Oscillator: 1
#pragma optsize-
CLKPR = 0 X 80 ;
CLKPR = 0 X 00 ;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize +
#endif

Initialisation de Ports d’entrée/sortie
Une initialisation de port
Func7 = en Func6 = en Func5 = en Func4 = en Func3 = à Func2 = à Func1 = en Func0 = en
Etat7 = État6 T = State5 T = T Etat4 = Etat3 T = State2 T = T State1 = State0 T = T
PORTA = 0 X 00 ;
DDRA = 0 X 00 ;

Initialisation du port B
Func7 = en Func6 = en Func5 = en Func4 = en Func3 = à Func2 = à Func1 = en Func0 = Out
Etat7 = État6 T = State5 T = T Etat4 = Etat3 T = State2 T = T State1 = State0 T = T
PORTB = 0 X 00 ;
DDRB = 0 X 00 ;

Initialisation du port C
Func7 = en Func6 = en Func5 = en Func4 = en Func3 = à Func2 = à Func1 = en Func0 = en
Etat7 = État6 T = State5 T = T Etat4 = Etat3 T = State2 T = T State1 = State0 T = T
PORTC = 0 X 00 ;
DDRC = 0 X 00 ;

Initialisation du port D
Func7 = en Func6 = en Func5 = en Func4 = en Func3 = à Func2 = à Func1 = en Func0 = en
Etat7 = État6 T = State5 T = T Etat4 = Etat3 T = State2 T = T State1 = State0 T = T
PORTD = 0 X 00 ;
DDDR = 0 X 00 ;

Initialisation du port E
Func2 = à Func1 = en Func0 = en
State2 = T State1 = State0 T = T
PORTE = 0 X 00 ;
DDRE = 0 X 00 ;

PORTK = 0 X 00 ;
DDRK = 0 X 00 ;

/**********************/
/ * INITIALISATION D’E/S * /
/**********************/
SORTIES
pinMode (13, sortie) ;

Initialisation du timer/compteur 1
Source de l’horloge : horloge système
Mode : Haut pH correct PWM = 00FFh
OC1A sortie : aban.
OC1B sortie : aban.
OC1C sortie : aban.
Canceler de bruit : arrêt
Capture d’entrée sur front descendant
Minuterie 1 débordement interrompre : sur
Interruption de la prise d’entrée : Off
Comparer une interruption du Match : Off
Comparer B interruption de Match : Off
Comparer l’interruption du Match C: Off
TCCR1A = 0 X 01 ;
TCCR1B = 0 X 04 ;
TCNT1H = 0 X 00 ;
TCNT1L = 0 X 00 ;
ICR1H = 0 X 00 ;
ICR1L = 0 X 00 ;
OCR1AH = 0 X 00 ;
OCR1AL = 0 X 00 ;
OCR1BH = 0 X 00 ;
OCR1BL = 0 X 00 ;
OCR1CH = 0 X 00 ;
OCR1CL = 0 X 00 ;

Initialisation de Interrupt(s) externe
EICRA = 0 X 00 ;
EICRB = 0 X 05 ;
EIMSK = 0 X 30 ;
EIFR = 0 X 30 ;
Interrompre le P.C.int
PCICR = 0 X 05 ;
PCIFR = 0 X 05 ;
PCMSK0 = 0 X 10 ;
PCMSK1 = 0 X 00 ;
PCMSK2 = 0 X 80 ;

Minuteries / ou les compteurs s Interrupt(s) d’initialisation
TIMSK1 | = 0 X 01 ;
TIFR1 | = 0 X 01 ;

/******************************/
/ * Initialisation du code * /
/******************************/

Enable global interruptions
SEI() ;

}

/******************/
/ * MAIN CODE BOUCLE * /
/******************/
void loop()
{

}

/********************************/
/ * FONCTION D’ESTIMATION DE POSITION * /
/********************************/

/ * Calculer la position du robot * /
Sub get_Odometers(void)
{
long left_wheel = 0 ;
long right_wheel = 0 ;

double left_mm = 0.0 ;
double right_mm = 0.0 ;

double distance = 0.0 ;

left_wheel = left_cnt ;
right_wheel = right_cnt ;

left_diff = last_left - left_wheel ;
right_diff = last_right - right_wheel ;

last_left = left_wheel ;
last_right = right_wheel ;

left_mm = (left_diff (double)) / TICK_PER_MM_LEFT ;
right_mm = (right_diff (double)) / TICK_PER_MM_RIGHT ;

distance = (left_mm + right_mm) / 2 ;
TOTAL_DISTANCE += distance ;

thêta += (right_mm - left_mm) / diamètre ;

Si (thêta > PI)
thêta-= TWOPI ;
Si (thêta < (-PI))
thêta += TWOPI ;

pos_Y += distance * sin(theta) ;
pos_X += distance * cos (theta) ;

}

Quelques explications :
La fonction ISR (__VECT__) sont les interruptions externes. Ils servent à compter le nombre de graduations de chaque codeur.
Le ISR(TIMER1_OVF_vect) est un arrêt de la minuterie. Il est utilisé pour faire un calcul parfaitement chronométré du poste.
La fonction get_Odometers() est la fonction qui calcule la position selon les tiques comptés avant.

Tout fonctionne pour vous ?
Félicitations ! Maintenant, votre robot peut calculer sa propre position !
Vous pouvez maintenant faire quelque chose comme ça :
Remote commander votre robot et laissez-le calculer sa propre position et envoyez-le à votre ordinateur pour imprimer le chemin d’accès du robot.

Vous trouvez que cool, mais vous voulez plus de votre robot ? Passez à l’étape suivante à faire aller de façon autonome à waypoints !

Articles Liés

Jouer des sons sur pc avec arduino et progduino

Jouer des sons sur pc avec arduino et progduino

Aujourd'hui je vais vous montrer comment il est facile de construire un lecteur simple et exécutez-le sur l'ordinateur avec arduino et progduino.En savoir plus sur progduino : http://www.progduino.comÉtape 1: Code Arduino - player sur votre pc.Copiez
Sauvegarder les données de température et d’humidité sur MySQL avec Arduino Uno et Wifly

Sauvegarder les données de température et d’humidité sur MySQL avec Arduino Uno et Wifly

Bonjour les gars, je fais ce instructable pour les gens qui aimaient l'électronique et la botanique, avec cela, vous avez les données concernant la temperatura et l'humidité de votre verger et ce registre de données MySQL de base.Pour ce projet dont
Photomaton automatisé prend une photo et il les messages sur Twitter avec Arduino et 1Sheeld

Photomaton automatisé prend une photo et il les messages sur Twitter avec Arduino et 1Sheeld

Tout le monde s'interroge un jour faire un photomaton dans tous les cas. En fait un il y a quelques jours il n'y avait pour la première fois en Egypte « Caire Mini Maker Faire » événement, où environ 3000 décideurs toute l'Egypte est venus de célébre
Utiliser la playstation à distance sur pc avec arduino

Utiliser la playstation à distance sur pc avec arduino

j'ai été doué d'une vieille playstation 1 distance un jour et a voulu l'utiliser sur l'ordinateur et ensuite acheté un adaptateur sur ebay qui était défectueux. J'ai donc enfin décidé à faire mes propres avec un arduino duemilanove. J'ai d'abord essa
Club House / jouer maison sur roues avec bac à sable de bois recyclé

Club House / jouer maison sur roues avec bac à sable de bois recyclé

Salut, il a été longtemps !Voici un projet litte : rêve de mon enfant était d'avoir un bac à sable, parce que celui de son ami en a un, donc, comme j'ai toujours voulu un club house quand j'étais gosse, j'ai décidé de combiner les deux.Il n'y avait a
Mettre en place le télégramme Bot sur Raspberry Pi

Mettre en place le télégramme Bot sur Raspberry Pi

Le 24 juin 2015, télégramme publié Bot API, permettant aux machines de parler le télégramme. Depuis ce jour, non seulement l'homme peut utiliser télégramme, so can machines.Pour ceux qui ne savent pas ce qu'est le télégramme, c'est une application de
Construire ce jardin d’eau Solar Powered hydroponique sur roues - incontournable !

Construire ce jardin d’eau Solar Powered hydroponique sur roues - incontournable !

Build cet incroyable énergie solaire, complètement autonome hydroponique jardin et cultiver les fleurs plus grandes, le plus savoureux fruits et légumes que vous pouvez réellement vivre sur toute l'année. Conçu pour un usage extérieur, qu'il peut tou
Lumières LED sur roues de velo pour la visibilité de nuit

Lumières LED sur roues de velo pour la visibilité de nuit

le but est d'installer une LED éclairs système composé d'une pile CR2032 avec commutateur de porte- et deux LED Light de l'emballage plastique de cravate sur une roue de vélo de course.Ce système mettra en place un poids supplémentaire de 7 grammes (
Contrôle JavaScript robotique et basée sur un navigateur Arduino

Contrôle JavaScript robotique et basée sur un navigateur Arduino

vos connaissances en développement web et JavaScript permettent de contrôler les projets d'Arduino et même robots (nœud + robots = nodebots) !Ceci est rendu facile avec node.js, Firmata et Johnny-cinq. Let's get started ! Johnny-cinq logo par Mike Sg
Sur chenilles Robot Arduino

Sur chenilles Robot Arduino

Cet Instructable va vous montrer comment construire un robot contrôlé par Arduino sur chenilles.Le contenu est organisé comme suit :Approvisionnement en pièces : Toutes les pièces nécessaires ont été recueillis, ainsi que des ressources pour examiner
Comment dessiner sur un Oscilloscope avec Arduino !

Comment dessiner sur un Oscilloscope avec Arduino !

Tout d'abord, laisse aller sur quelques notions de base. Un oscilloscope est un outil de visualisation de changement des signaux électriques.Oscilloscope: Oscillation (changement), portée (visualisation). Ensemble, ils font « oscilloscope » !Un oscil
Boucles d’oreilles résistance cliquez sur roue

Boucles d’oreilles résistance cliquez sur roue

donc j'ai essayé de trouver quelque chose pour ma copine pour son anniversaire, mais n'était pas d'avoir beaucoup de chance. Elle aime les bijoux, mais je reçois toujours ses bijoux alors que j'essayais de penser à quelque chose de différent. Elle es
Construire une maison solaire sur roues

Construire une maison solaire sur roues

Concours Info :Mon nom est LaMar Alexander. Je suis fermier d'au loin-grille long temps, dessinateur architectural, concepteur et constructeur de petites maisons au loin-grille. J'ai publié plusieurs livres sur la construction de petites cabines sola
Légumes sur roues

Légumes sur roues

Mon projet a plusieurs cibles que je veux atteindre :Comme mon appartement est juste en dessous du toit de l'immeuble, j'ai beaucoup de pertes d'énergie en hiver & été, et je tiens à le minimiser créant une couverture végétale, cette couverture doit