Cours:LeonardoSerialUsb : Différence entre versions

De troyesGEII
Aller à : navigation, rechercher
(Page créée avec « Nous allons utiliser du code du site pjrc.com : https://www.pjrc.com/teensy/usb_serial.html Nous aurons besoin des 2 fichiers suivants : {{boîte déroulante début|tit... »)
 
m (Et un exemple pour essayer)
 
(7 révisions intermédiaires par 2 utilisateurs non affichées)
Ligne 1 : Ligne 1 :
 
+
=Présentation de la bibliothèque=
 
Nous allons utiliser du code du site pjrc.com : https://www.pjrc.com/teensy/usb_serial.html
 
Nous allons utiliser du code du site pjrc.com : https://www.pjrc.com/teensy/usb_serial.html
  
Ligne 1 070 : Ligne 1 070 :
 
</source>
 
</source>
 
{{boîte déroulante fin}}
 
{{boîte déroulante fin}}
 +
 +
=Et un exemple pour essayer=
 +
 +
Avec ces deux fichiers, vous disposez d'un exemple présenté dans la boîte déroulante ci-dessous. Même s'il est fait pour une carte Teensy, vous pouvez facilement l'utiliser avec une carte Arduino Leonardo. Ces deux cartes disposent du processeur AVR ATMega 32U4 qui possède une partie matérielle pour faire fonctionner l'USB.
 +
 +
{{boîte déroulante début|titre=Fichier : exemple.c}}
 +
<source lang=c>
 +
/* Simple example for Teensy USB Development Board
 +
* http://www.pjrc.com/teensy/
 +
* Copyright (c) 2008 PJRC.COM, LLC
 +
*
 +
* Permission is hereby granted, free of charge, to any person obtaining a copy
 +
* of this software and associated documentation files (the "Software"), to deal
 +
* in the Software without restriction, including without limitation the rights
 +
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 +
* copies of the Software, and to permit persons to whom the Software is
 +
* furnished to do so, subject to the following conditions:
 +
*
 +
* The above copyright notice and this permission notice shall be included in
 +
* all copies or substantial portions of the Software.
 +
*
 +
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 +
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 +
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 +
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 +
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 +
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 +
* THE SOFTWARE.
 +
*/
 +
 +
#include <avr/io.h>
 +
#include <avr/pgmspace.h>
 +
#include <stdint.h>
 +
#include <util/delay.h>
 +
#include "usb_serial.h"
 +
 +
#define LED_CONFIG (DDRD |= (1<<6))
 +
#define LED_ON (PORTD |= (1<<6))
 +
#define LED_OFF (PORTD &= ~(1<<6))
 +
#define CPU_PRESCALE(n) (CLKPR = 0x80, CLKPR = (n))
 +
 +
void send_str(const char *s);
 +
uint8_t recv_str(char *buf, uint8_t size);
 +
void parse_and_execute_command(const char *buf, uint8_t num);
 +
 +
#if 0
 +
// Very simple character echo test
 +
int main(void)
 +
{
 +
CPU_PRESCALE(0);
 +
usb_init();
 +
while (1) {
 +
int n = usb_serial_getchar();
 +
if (n >= 0) usb_serial_putchar(n);
 +
}
 +
}
 +
 +
#else
 +
 +
// Basic command interpreter for controlling port pins
 +
int main(void)
 +
{
 +
char buf[32];
 +
uint8_t n;
 +
 +
// set for 16 MHz clock, and turn on the LED
 +
CPU_PRESCALE(0);
 +
LED_CONFIG;
 +
LED_ON;
 +
 +
// initialize the USB, and then wait for the host
 +
// to set configuration.  If the Teensy is powered
 +
// without a PC connected to the USB port, this
 +
// will wait forever.
 +
usb_init();
 +
while (!usb_configured()) /* wait */ ;
 +
_delay_ms(1000);
 +
 +
while (1) {
 +
// wait for the user to run their terminal emulator program
 +
// which sets DTR to indicate it is ready to receive.
 +
while (!(usb_serial_get_control() & USB_SERIAL_DTR)) /* wait */ ;
 +
 +
// discard anything that was received prior.  Sometimes the
 +
// operating system or other software will send a modem
 +
// "AT command", which can still be buffered.
 +
usb_serial_flush_input();
 +
 +
// print a nice welcome message
 +
send_str(PSTR("\r\nTeensy USB Serial Example, "
 +
"Simple Pin Control Shell\r\n\r\n"
 +
"Example Commands\r\n"
 +
"  B0?  Read Port B, pin 0\r\n"
 +
"  C2=0  Write Port C, pin 1 LOW\r\n"
 +
"  D6=1  Write Port D, pin 6 HIGH  (D6 is LED pin)\r\n\r\n"));
 +
 +
// and then listen for commands and process them
 +
while (1) {
 +
send_str(PSTR("> "));
 +
n = recv_str(buf, sizeof(buf));
 +
if (n == 255) break;
 +
send_str(PSTR("\r\n"));
 +
parse_and_execute_command(buf, n);
 +
}
 +
}
 +
}
 +
#endif
 +
 +
// Send a string to the USB serial port.  The string must be in
 +
// flash memory, using PSTR
 +
//
 +
void send_str(const char *s)
 +
{
 +
char c;
 +
while (1) {
 +
c = pgm_read_byte(s++);
 +
if (!c) break;
 +
usb_serial_putchar(c);
 +
}
 +
}
 +
 +
// Receive a string from the USB serial port.  The string is stored
 +
// in the buffer and this function will not exceed the buffer size.
 +
// A carriage return or newline completes the string, and is not
 +
// stored into the buffer.
 +
// The return value is the number of characters received, or 255 if
 +
// the virtual serial connection was closed while waiting.
 +
//
 +
uint8_t recv_str(char *buf, uint8_t size)
 +
{
 +
int16_t r;
 +
uint8_t count=0;
 +
 +
while (count < size) {
 +
r = usb_serial_getchar();
 +
if (r != -1) {
 +
if (r == '\r' || r == '\n') return count;
 +
if (r >= ' ' && r <= '~') {
 +
*buf++ = r;
 +
usb_serial_putchar(r);
 +
count++;
 +
}
 +
} else {
 +
if (!usb_configured() ||
 +
  !(usb_serial_get_control() & USB_SERIAL_DTR)) {
 +
// user no longer connected
 +
return 255;
 +
}
 +
// just a normal timeout, keep waiting
 +
}
 +
}
 +
return count;
 +
}
 +
 +
// parse a user command and execute it, or print an error message
 +
//
 +
void parse_and_execute_command(const char *buf, uint8_t num)
 +
{
 +
uint8_t port, pin, val;
 +
 +
if (num < 3) {
 +
send_str(PSTR("unrecognized format, 3 chars min req'd\r\n"));
 +
return;
 +
}
 +
// first character is the port letter
 +
if (buf[0] >= 'A' && buf[0] <= 'F') {
 +
port = buf[0] - 'A';
 +
} else if (buf[0] >= 'a' && buf[0] <= 'f') {
 +
port = buf[0] - 'a';
 +
} else {
 +
send_str(PSTR("Unknown port \""));
 +
usb_serial_putchar(buf[0]);
 +
send_str(PSTR("\", must be A - F\r\n"));
 +
return;
 +
}
 +
// second character is the pin number
 +
if (buf[1] >= '0' && buf[1] <= '7') {
 +
pin = buf[1] - '0';
 +
} else {
 +
send_str(PSTR("Unknown pin \""));
 +
usb_serial_putchar(buf[0]);
 +
send_str(PSTR("\", must be 0 to 7\r\n"));
 +
return;
 +
}
 +
// if the third character is a question mark, read the pin
 +
if (buf[2] == '?') {
 +
// make the pin an input
 +
*(uint8_t *)(0x21 + port * 3) &= ~(1 << pin);
 +
// read the pin
 +
val = *(uint8_t *)(0x20 + port * 3) & (1 << pin);
 +
usb_serial_putchar(val ? '1' : '0');
 +
send_str(PSTR("\r\n"));
 +
return;
 +
}
 +
// if the third character is an equals sign, write the pin
 +
if (num >= 4 && buf[2] == '=') {
 +
if (buf[3] == '0') {
 +
// make the pin an output
 +
*(uint8_t *)(0x21 + port * 3) |= (1 << pin);
 +
// drive it low
 +
*(uint8_t *)(0x22 + port * 3) &= ~(1 << pin);
 +
return;
 +
} else if (buf[3] == '1') {
 +
// make the pin an output
 +
*(uint8_t *)(0x21 + port * 3) |= (1 << pin);
 +
// drive it high
 +
*(uint8_t *)(0x22 + port * 3) |= (1 << pin);
 +
return;
 +
} else {
 +
send_str(PSTR("Unknown value \""));
 +
usb_serial_putchar(buf[3]);
 +
send_str(PSTR("\", must be 0 or 1\r\n"));
 +
return;
 +
}
 +
}
 +
// otherwise, error message
 +
send_str(PSTR("Unknown command \""));
 +
usb_serial_putchar(buf[0]);
 +
send_str(PSTR("\", must be ? or =\r\n"));
 +
}
 +
</source>
 +
{{boîte déroulante fin}}
 +
 +
{{Todo|Compiler le programme d'exemple et essayez-le. Celui-ci doit être compilé avec '''avr-gcc''' et non pas '''avr-g++'''. Cela signifie qu'il sera difficile de l'utiliser avec l'environnement Arduino mais pourra être testé avec Eclipse.}}
 +
 +
 +
Ce programme réalise un mini terminal série avec comme écran d'accueil :
 +
 +
<pre>
 +
Teensy USB Serial Example, Simple Pin Control Shell
 +
 +
Example Commands
 +
  B0?  Read Port B, pin 0
 +
  C2=0  Write Port C, pin 1 LOW
 +
  D6=1  Write Port D, pin 6 HIGH  (D6 is LED pin)
 +
</pre>
 +
 +
Sur la carte Arduino Leonardo la célèbre LED 13 est câblée sur le bit 7 du PORTC. Ainsi l'envoi de la commande C7=0 vous éteindra cette LED 13 tandis que C7=1 l'allumera....
 +
 +
=Voir aussi=
 +
* [https://github.com/Palatis/Arduino-Lufa Bibliothèque LUFA pour Arduino]
 +
* [http://medesign.seas.upenn.edu/index.php/Guides/MaEvArM-usb MEAM.Design : ATmega32u4 : USB Communications]
 +
* [https://github.com/juanjold/hockbot Github associé au lien ci-dessus]
 +
* [https://en.wikibooks.org/wiki/Serial_Programming/USB Wikibook en anglais]
 +
* [https://www.beyondlogic.org/usbnutshell/usb1.shtml USB in a Nutshell Chapter 1]
 +
* [https://www.usbmadesimple.co.uk/ums_1.htm USB maide simple Part 1]

Version actuelle datée du 18 janvier 2022 à 18:53

Présentation de la bibliothèque

Nous allons utiliser du code du site pjrc.com : https://www.pjrc.com/teensy/usb_serial.html

Nous aurons besoin des 2 fichiers suivants :

[Développer]

Fichier : usb_serial.h

[Développer]

Fichier : usb_serial.c

Et un exemple pour essayer

Avec ces deux fichiers, vous disposez d'un exemple présenté dans la boîte déroulante ci-dessous. Même s'il est fait pour une carte Teensy, vous pouvez facilement l'utiliser avec une carte Arduino Leonardo. Ces deux cartes disposent du processeur AVR ATMega 32U4 qui possède une partie matérielle pour faire fonctionner l'USB.

[Développer]

Fichier : exemple.c

Todo.jpg Compiler le programme d'exemple et essayez-le. Celui-ci doit être compilé avec avr-gcc et non pas avr-g++. Cela signifie qu'il sera difficile de l'utiliser avec l'environnement Arduino mais pourra être testé avec Eclipse.


Ce programme réalise un mini terminal série avec comme écran d'accueil :

Teensy USB Serial Example, Simple Pin Control Shell

Example Commands
  B0?   Read Port B, pin 0
  C2=0  Write Port C, pin 1 LOW
  D6=1  Write Port D, pin 6 HIGH  (D6 is LED pin)

Sur la carte Arduino Leonardo la célèbre LED 13 est câblée sur le bit 7 du PORTC. Ainsi l'envoi de la commande C7=0 vous éteindra cette LED 13 tandis que C7=1 l'allumera....

Voir aussi