Catégorie:RobotGEII : Différence entre versions

De troyesGEII
Aller à : navigation, rechercher
({{Bleu|Principe de la communication SPI sur Arduino}})
({{Bleu|Principe de la communication SPI sur Arduino}})
Ligne 45 : Ligne 45 :
  
 
Une liaison SPI (Serial Peripheral Interface) est un bus de données série synchrone, qui opère en Full-duplex. Les circuits communiquent selon un schéma maître-esclaves, où le maître s'occupe totalement de la communication. Plusieurs esclaves peuvent coexister sur un même bus, dans ce cas, la sélection du destinataire se fait par le Slave Select.
 
Une liaison SPI (Serial Peripheral Interface) est un bus de données série synchrone, qui opère en Full-duplex. Les circuits communiquent selon un schéma maître-esclaves, où le maître s'occupe totalement de la communication. Plusieurs esclaves peuvent coexister sur un même bus, dans ce cas, la sélection du destinataire se fait par le Slave Select.
 +
  
 
[[Fichier:SPI_three_slaves.svg.png|300px]]
 
[[Fichier:SPI_three_slaves.svg.png|300px]]
Ligne 54 : Ligne 55 :
 
*'''SLK''' : Serial Clock, Horloge de synchronisation généré par le maître
 
*'''SLK''' : Serial Clock, Horloge de synchronisation généré par le maître
 
*'''SS''' : Slave Select, utilisé si on dispose de plusieurs esclaves pour sélectionner avec lequel on communique
 
*'''SS''' : Slave Select, utilisé si on dispose de plusieurs esclaves pour sélectionner avec lequel on communique
 +
<br><br>
 +
 +
=={{Vert|Maintenant que le principe de fonctionnement de la liaison SPI est éclaircit, intéressons nous aux échanges de données:}}==
 +
 +
<br>
 +
[[Fichier:SPI 8-bit circular transfer.svg.png|500px]]
 +
 +
{{Todo|
 +
on notera que les données circulent de manière '''circulaire'''; le bit 7 du master arrive sur b0 du slave, tandis que b7 du slave est envoyé sur b0 du master. il y a un décalage des bits contenus dans le registre {{Rouge|SPDR (registre qui stock les données recues et envoyées sur la liaison SPI)}}.}}
 +
<br><br>
 +
 +
=={{Vert|Avec ces quelques bases, nous pouvons comprendre le programme Arduino suivant qui établit une communication quelques peu rudimentaire, mais qui illustre les fonctions Arduino utilisées pour créer une communication SPI:}}==
 +
 +
{{Todo|
 +
la carte Arduino Uno que nous utilisons possède déjà des pattes dédiées à la communication SPI:
 +
 +
*'''MOSI : Pin 11'''
 +
*'''MISO : Pin 12'''
 +
*'''SCLK : Pin 13'''
 +
*'''SS : Pin 10'''
 +
*'''N'oublions pas de connecter les masses Arduino ensembles pour que la tension de référence soit la même'''}}
 +
<br><br>
 +
 +
<br>
 +
'''Programme maître:'''
 +
<br>
 +
<source lang=c>
 +
// Written by Nick Gammon
 +
// February 2011
 +
 +
 +
#include <SPI.h>
  
Maintenant que le principe de fonctionnement de la liaison SPI est éclaircit, intéressons nous aux échanges de données:
+
void setup (void)
 +
{
  
 +
  digitalWrite(SS, HIGH);  // ensure SS stays high for now
  
[[Fichier:SPI_three_slaves.svg.png|300px]]
+
  // Put SCK, MOSI, SS pins into output mode
 +
  // also put SCK, MOSI into LOW state, and SS into HIGH state.
 +
  // Then put SPI hardware into Master mode and turn SPI on
 +
  SPI.begin ();
 +
 
 +
  // Slow down the master a bit
 +
  SPI.setClockDivider(SPI_CLOCK_DIV8);
 +
  Serial.begin(115200);
 +
 
 +
}  // end of setup
 +
 
 +
 
 +
void loop (void)
 +
{
 +
 
 +
  char c,r;
 +
 
 +
  // enable Slave Select
 +
  digitalWrite(SS, LOW);    // SS is pin 10
 +
 
 +
  // send test string
 +
  for (const char * p = "Hello, world!\n" ; c = *p; p++)
 +
    Serial.write(SPI.transfer (c));
 +
  Serial.write('\n');
 +
  // disable Slave Select
 +
  digitalWrite(SS, HIGH);
 +
 
 +
  delay (1000);  // 1 seconds delay
 +
}  // end of loop
 +
</source>
 +
<br><br><br>
 +
'''Programme esclave:'''
 +
<br>
 +
<source lang=c>
 +
// Written by Nick Gammon
 +
// February 2011
 +
 
 +
 
 +
#include <SPI.h>
 +
 
 +
char buf [100];
 +
volatile byte pos;
 +
volatile boolean process_it;
 +
 
 +
void setup (void)
 +
{
 +
  Serial.begin (115200);  // debugging
 +
 
 +
  // turn on SPI in slave mode
 +
  SPCR |= bit (SPE);
 +
 
 +
  // have to send on master in, *slave out*
 +
  pinMode(MISO, OUTPUT);
 +
 
 +
  // get ready for an interrupt
 +
  pos = 0;  // buffer empty
 +
  process_it = false;
 +
 
 +
  // now turn on interrupts
 +
  SPI.attachInterrupt();
 +
 
 +
}  // end of setup
 +
 
 +
 
 +
// SPI interrupt routine
 +
ISR (SPI_STC_vect)
 +
{
 +
  static uint8_t i=0;
 +
byte c = SPDR;  // grab byte from SPI Data Register
 +
 
 +
  // add to buffer if room
 +
  if (pos < sizeof buf)
 +
    {
 +
    buf [pos++] = c;
 +
//  SPDR=i;
 +
//  i++;
 +
    // example: newline means time to process buffer
 +
    if (c == '\n')
 +
      process_it = true;
 +
     
 +
    }  // end of room available
 +
   
 +
}  // end of interrupt routine SPI_STC_vect
  
on notera
+
// main loop - wait for flag set in interrupt routine
 +
void loop (void)
 +
{
 +
  if (process_it)
 +
    {
 +
    buf [pos] = 0; 
 +
    Serial.println (buf);
 +
    pos = 0;
 +
    process_it = false;
 +
    }  // end of flag set
 +
   
 +
}  // end of loop
 +
</source>
  
 
=={{Bleu| Codeur et mesure}}==
 
=={{Bleu| Codeur et mesure}}==
  
 
={{Rouge|système de fin de course (ballon) (Maxime)}}=
 
={{Rouge|système de fin de course (ballon) (Maxime)}}=

Version du 9 octobre 2015 à 10:21


Description et présentation du Projet

Présentation du championnat

Structure du robot

Carte ultrason (Alexandre.N)

programme de test des capteurs US :

int trig = 36; int echo = A9; long lecture_echo; long cm;


void setup() {

 pinMode(trig, OUTPUT);
 digitalWrite(trig, LOW);
 pinMode(echo, INPUT);
 Serial.begin(9600);

}

void loop() {

 digitalWrite(trig, HIGH);
 delayMicroseconds(10);
 digitalWrite(trig, LOW);
 lecture_echo = pulseIn(echo, HIGH);
 cm = lecture_echo / 58;
 Serial.print("Distance : ");
 Serial.print(cm);
 Serial.println(" cm");
 delay(100);

}

Carte gestion des moteurs (Johan)

Carte ultrason (Vincent)

Comunication SPI arduino (Alexandre.L)

Principe de la communication SPI sur Arduino

Une liaison SPI (Serial Peripheral Interface) est un bus de données série synchrone, qui opère en Full-duplex. Les circuits communiquent selon un schéma maître-esclaves, où le maître s'occupe totalement de la communication. Plusieurs esclaves peuvent coexister sur un même bus, dans ce cas, la sélection du destinataire se fait par le Slave Select.


SPI three slaves.svg.png

on dispose donc des pattes suivantes:

  • MOSI : Master Output Slave Input, le maître parle l'esclave écoute
  • MISO : Master Input Slave Output, le maître écoute, l’esclave parle
  • SLK : Serial Clock, Horloge de synchronisation généré par le maître
  • SS : Slave Select, utilisé si on dispose de plusieurs esclaves pour sélectionner avec lequel on communique



Maintenant que le principe de fonctionnement de la liaison SPI est éclaircit, intéressons nous aux échanges de données:


SPI 8-bit circular transfer.svg.png

Todo.jpg on notera que les données circulent de manière circulaire; le bit 7 du master arrive sur b0 du slave, tandis que b7 du slave est envoyé sur b0 du master. il y a un décalage des bits contenus dans le registre SPDR (registre qui stock les données recues et envoyées sur la liaison SPI).

Avec ces quelques bases, nous pouvons comprendre le programme Arduino suivant qui établit une communication quelques peu rudimentaire, mais qui illustre les fonctions Arduino utilisées pour créer une communication SPI:

Todo.jpg la carte Arduino Uno que nous utilisons possède déjà des pattes dédiées à la communication SPI:

  • MOSI : Pin 11
  • MISO : Pin 12
  • SCLK : Pin 13
  • SS : Pin 10
  • N'oublions pas de connecter les masses Arduino ensembles pour que la tension de référence soit la même




Programme maître:

// Written by Nick Gammon
// February 2011


#include <SPI.h>

void setup (void)
{

  digitalWrite(SS, HIGH);  // ensure SS stays high for now

  // Put SCK, MOSI, SS pins into output mode
  // also put SCK, MOSI into LOW state, and SS into HIGH state.
  // Then put SPI hardware into Master mode and turn SPI on
  SPI.begin ();

  // Slow down the master a bit
  SPI.setClockDivider(SPI_CLOCK_DIV8);
  Serial.begin(115200);
  
}  // end of setup


void loop (void)
{

  char c,r;

  // enable Slave Select
  digitalWrite(SS, LOW);    // SS is pin 10

  // send test string
  for (const char * p = "Hello, world!\n" ; c = *p; p++)
    Serial.write(SPI.transfer (c));
  Serial.write('\n');
  // disable Slave Select
  digitalWrite(SS, HIGH);

  delay (1000);  // 1 seconds delay 
}  // end of loop




Programme esclave:

// Written by Nick Gammon
// February 2011


#include <SPI.h>

char buf [100];
volatile byte pos;
volatile boolean process_it;

void setup (void)
{
  Serial.begin (115200);   // debugging
  
  // turn on SPI in slave mode
  SPCR |= bit (SPE);

  // have to send on master in, *slave out*
  pinMode(MISO, OUTPUT);
  
  // get ready for an interrupt 
  pos = 0;   // buffer empty
  process_it = false;

  // now turn on interrupts
  SPI.attachInterrupt();

}  // end of setup


// SPI interrupt routine
ISR (SPI_STC_vect)
{
  static uint8_t i=0;
byte c = SPDR;  // grab byte from SPI Data Register
  
  // add to buffer if room
  if (pos < sizeof buf)
    {
    buf [pos++] = c;
 //   SPDR=i;
 //   i++;
    // example: newline means time to process buffer
    if (c == '\n')
      process_it = true;
      
    }  // end of room available
    
}  // end of interrupt routine SPI_STC_vect

// main loop - wait for flag set in interrupt routine
void loop (void)
{
  if (process_it)
    {
    buf [pos] = 0;  
    Serial.println (buf);
    pos = 0;
    process_it = false;
    }  // end of flag set
    
}  // end of loop

Codeur et mesure

système de fin de course (ballon) (Maxime)

Sous-catégories

Cette catégorie comprend seulement la sous-catégorie ci-dessous.

Pages dans la catégorie « RobotGEII »

Cette catégorie comprend 4 pages, dont les 4 ci-dessous.