Nathonline
Posts: 8
Joined: Thu May 23, 2013 11:49 am

Zigbee - XBee + Raspberry Pi sans arduino

Thu May 23, 2013 12:02 pm

Bonjour à tous,

Je suis nouveau dans le domaine de l'électronique et de ce fait je voudrai valider avec vous un schéma que j'ai pu voir sur internet.

Il s'agit d'une installation XBee qui ne sollicite pas arduino, alors qu'habituellement il est tj demandé d'avoir cette board.

Je trouve ce schéma quelque peu simpliste, marche t il ? Toutes les fonctionnalités seront opérationnelles sinon lesquelles seront manquantes ?

http://erasmusitisdooporto.files.wordpr ... ection.png

Merci de votre aide :)

LeSanglier
Posts: 226
Joined: Fri Jan 11, 2013 8:11 pm
Location: In Hell with God
Contact: Website

Re: Zigbee - XBee + Raspberry Pi sans arduino

Thu May 23, 2013 1:26 pm

Salut,

Quel est le type de ce xbee ? bluetooth ? wifi ?
Peut-être que cette précision aura une incidence sur le montage.
Comme toi, je suis nul en électronique mais ton montage m'intéresse.
Pour info, j'utilise un shield seeeduino et un xbee bluetooth seeeduino sur du Arduino Uno.
Mon blog sur le Raspberry Pi : http://framboisepi.fr/
Pour avoir plus de chance d'avoir une réponse à votre question,
allez sur le forum français Rasberry Pi : http://forum.raspfr.org

ToOnS
Posts: 492
Joined: Sat Mar 23, 2013 10:29 am

Re: Zigbee - XBee + Raspberry Pi sans arduino

Thu May 23, 2013 2:06 pm

Salut , en theorie ca marche , le XBee s'alimente bien en 3.3v et tire 50ma au pire pour la version pas pro , juste ne pas depasser les 115.2 Kbps avec l'usart du RPI (le XBee va pas plus vite)
peut etre rajouter en option une ligne (GPIO vert) sur le reset et sur le sleep (si c'est sur batterie pour eviter de consommer quand il sert a rien)
LeSanglier , c'est de la radio a 2.4Ghz , ca ressemble plutôt a du wifi (sans en etre vraiment) , ca ressemble plus encore aux signaux radio des voitures radio commandées (DSSS)
Last edited by ToOnS on Thu May 23, 2013 3:57 pm, edited 1 time in total.

totoharibo
Posts: 4475
Joined: Thu Jan 24, 2013 8:43 am

Re: Zigbee - XBee + Raspberry Pi sans arduino

Thu May 23, 2013 2:56 pm

regardes : tu ne peux pas "pomper"grand chose sur le 3.3.V du RPi.

Nathonline
Posts: 8
Joined: Thu May 23, 2013 11:49 am

Re: Zigbee - XBee + Raspberry Pi sans arduino

Thu May 23, 2013 3:09 pm

ToOnS wrote:Salut , en theorie ca marche , le XBee s'alimente bien en 3.3v et tire 250ma au pire pour la version pro (+700ma du rpi ca fait 950 ma, ca depasse pas 1A a condition de pas brancher autre chose) , juste ne pas depasser les 115.2 Kbps avec l'usart du RPI (le XBee va pas plus vite)
peut etre rajouter en option une ligne (GPIO vert) sur le reset et sur le sleep (si c'est sur batterie pour eviter de consommer quand il sert a rien)
LeSanglier , c'est de la radio a 2.4Ghz , ca ressemble plutôt a du wifi (sans en etre vraiment) , ca ressemble plus encore aux signaux radio des voitures radio commandées (DSSS)
Le Sanglier, ToOnS,

Merci d'avoir porté un intérêt à mon post ;).

Quelques questions persiste cependant :

1 - Si cela fonctionne correctement, pourquoi beaucoup de personne passe par un arduino (de plus je pense que ces personnes sont loin d'être stupides donc il y a forcement une raison)
2 - Au sujet de l'alimentation, si je trouve un transformateur qui me met du output en 5V/3A je pourrai derrière rajouter une clé wifi ou bluetooth ? Quel est l'ampérage limite avant de faire griller la framboise ? Est-il possible de l'alimenter de par une source externe ?
3 - Pourquoi il est nécéssaire que le debit ne depasse pas 115.2kbps sur l'UART (c'est cela que tu voulais dire en écrivant "Usart" ?)

Ahaha, voila que je deviens embetant avec mes questions :mrgreen:
Last edited by Nathonline on Thu May 23, 2013 3:24 pm, edited 1 time in total.

ToOnS
Posts: 492
Joined: Sat Mar 23, 2013 10:29 am

Re: Zigbee - XBee + Raspberry Pi sans arduino

Thu May 23, 2013 3:12 pm

totoharibo : ah oui oupsss j'etais concentré sur le 5V , avec 3.3v c'est 50ma donc faut oublier le XBee pro qui consomme trop mais le standard consomme 50ma (j'ai modifié mon post du coup , je merite le fouet ?)

1) parcequ'ils ont peur ? (ca c'est a eux qu'il faut demander)
2) de tout facon il est bridé a 1.1A alors 3A ca changera rien (enfin ca depand par ou tu l'alimentes)
3) parceque le XBee va pas plus vite a communiquer via l'uSart (ou uart le nom depend de comment tu l'utilises)
Last edited by ToOnS on Thu May 23, 2013 4:00 pm, edited 3 times in total.

Nathonline
Posts: 8
Joined: Thu May 23, 2013 11:49 am

Re: Zigbee - XBee + Raspberry Pi sans arduino

Thu May 23, 2013 3:26 pm

Hello ToOnS,

1 - Ok :)
2 - Zut de flûte, comment je fais si je souhaite brancher (à titre d'exemple) un zigbee, un wifi et un bluetooth ? Question plus large : Comment gere-t-on les problématiques d'alimentation ? :?
3 - Je vais me renseigner sur la difference entre le mode "UART", "USART"

Merci

ToOnS
Posts: 492
Joined: Sat Mar 23, 2013 10:29 am

Re: Zigbee - XBee + Raspberry Pi sans arduino

Thu May 23, 2013 3:40 pm

2) tu dois sans probleme pouvoir brancher au moins 2 des 3
le XBee pas pro sur le 3.3v qui fourni juste le courant qu'il faut , le wifi par l'usb (donc sur le 5V , tu as 400ma de dispo) et/ou le Bluetooth par usb (donc toujours avec les 400ma de dispo)

ou encore le wifi+le Bluetooth si tu alimentes le rpi par le +5v du GPIO , la par contre t'es pas bridé (enfin si par la taille des pistes faut quand meme pas exagerer si tu veux pas les fondre seulement dans ce cas qu'une alim de plus de 1A est utile)

mais pourquoi utiliser autant de systèmes "radio" ?
Last edited by ToOnS on Thu May 23, 2013 3:49 pm, edited 1 time in total.

Nathonline
Posts: 8
Joined: Thu May 23, 2013 11:49 am

Re: Zigbee - XBee + Raspberry Pi sans arduino

Thu May 23, 2013 3:46 pm

Ok merci pour tes éclaircissements. Je vais essayer de mieux comprendre aussi ce qu'est le GPIO.

Pourquoi zigbee + Bluetooth + wifi ... Aucune juste à titre pédagogique. :)

Merci encore ToOnS

LeSanglier
Posts: 226
Joined: Fri Jan 11, 2013 8:11 pm
Location: In Hell with God
Contact: Website

Re: Zigbee - XBee + Raspberry Pi sans arduino

Thu May 23, 2013 7:24 pm

Nathonline wrote: 1 - Si cela fonctionne correctement, pourquoi beaucoup de personne passe par un arduino (de plus je pense que ces personnes sont loin d'être stupides donc il y a forcement une raison)
Arduino est plus ancien que le Raspberry donc il y a une plus grande littérature à ce sujet (livre magazine), la communauté des utilisateurs est largement plus grande que celle du RPi. Arduino, c'est de l'électronique "pure".
Mon blog sur le Raspberry Pi : http://framboisepi.fr/
Pour avoir plus de chance d'avoir une réponse à votre question,
allez sur le forum français Rasberry Pi : http://forum.raspfr.org

Nathonline
Posts: 8
Joined: Thu May 23, 2013 11:49 am

Re: Zigbee - XBee + Raspberry Pi sans arduino

Thu May 23, 2013 9:18 pm

Hello,

J'ai un petit peu lu la documention, effectivement, en l'état ça peut marcher. Par contre pour la mise à jour du firmware, deux broches sont à connecter : RTS et DTR.
Je n'ai rien contre le principe, mais je les branche où sur l'UART?

Merci ;)

ToOnS
Posts: 492
Joined: Sat Mar 23, 2013 10:29 am

Re: Zigbee - XBee + Raspberry Pi sans arduino

Thu May 23, 2013 10:18 pm

sur deux des GPIO verts (que tu passes a 0 pour dire Data Terminal Ready (DTR) et Request To Send (RTS)) ou directement a la masse

pour DTR tu es sur qu'il le faut ? tu as un lien pour l'update du firmware stp ?
normalement juste besoin de TX , RX , +3.3v et GND sur Dout , Din , +3.3v et gnd (dans cet ordre) meme pour le regler mais pour l'update je suis pas sur (le dernier firmware date de janvier 2012 c'est vraiment necessaire ?)

Nathonline
Posts: 8
Joined: Thu May 23, 2013 11:49 am

Re: Zigbee - XBee + Raspberry Pi sans arduino

Fri May 24, 2013 8:22 am

Hello ToOnS,

Ici la documentation : http://ftp1.digi.com/support/documentat ... 0982_L.pdf
Tu as l'info à la page 8, première ligne.

ToOnS
Posts: 492
Joined: Sat Mar 23, 2013 10:29 am

Re: Zigbee - XBee + Raspberry Pi sans arduino

Fri May 24, 2013 10:30 am

ah oui ils doivent servir a quelquechose pendant l'update du firmware (donc changer de valeur , alors il faut les mettre sur un GPIO vert) mais je n'ai rien trouvé pour updater le firmware via linux (ou arduino) et encore moins en open source histoire de voir a quel(s) moment(s) les valeurs basculent , par contre j'ai vu que ca peu se faire via "l'air" (enfin via la radio) mais pareil j'ai rien trouvé pour linux (ou arduino) , au pire tu fais l'update avec Windows (ca se fait qu'une fois et encore faut vraiment avoir un XBee du grenier) comme ca tu t'occupes pas de DTR et de RTS avec le RPI

Paul Estuaire
Posts: 2
Joined: Tue Nov 12, 2013 3:09 pm

Re: Zigbee - XBee + Raspberry Pi sans arduino

Tue Nov 12, 2013 3:16 pm

J'ai trouvé une clé USB ZigBee toute petite sur le site de Cleode. Il n'y a rien à faire il suffit de l'insérer sur un port usb.
Et en plus il y a un package pour Raspberry depuis peu WiBee-PI pour gérer un réseau ZigBee et ca marche super bien :D .
http://www.cleode.fr/fr/produits.php?page=wibeepi
Paul

pihito
Posts: 19
Joined: Wed May 15, 2013 3:25 pm

Re: Zigbee - XBee + Raspberry Pi sans arduino

Wed Nov 13, 2013 3:06 pm

Bonjour Paul,

Peux tu me dire où tu t'es procuré la clé ?

Paul Estuaire
Posts: 2
Joined: Tue Nov 12, 2013 3:09 pm

Re: Zigbee - XBee + Raspberry Pi sans arduino

Thu Nov 28, 2013 2:23 pm

Bonjour,

Ben, la clé est fournie avec le package pour Rapsberry. Il suffit d'envoyer un message via leur site internet et leur demander que tu veux acheter le produit WiBee-PI.
Si tu veux seulement la clé, tu peux aussi l'acheter. C'est le produit Ubee Nano

http://www.cleode.fr/fr/produits.php?page=ubeenano

Paul

danjperron
Posts: 3522
Joined: Thu Dec 27, 2012 4:05 am
Location: Québec, Canada

Re: Zigbee - XBee + Raspberry Pi sans arduino

Thu Nov 28, 2013 5:37 pm

Salut Nathonline,

pour ce qui est tu 3.3v , il n'y a rien de plus facile d'ajouter un regulateur de 3.3v comme un LE33cz.

Si tu as besoin de plus de puissance , utilise un adaptateur externe de plus de 9 V avec un regulateur muRata OKI-78SR-3.3V.

Image



Daniel

danjperron
Posts: 3522
Joined: Thu Dec 27, 2012 4:05 am
Location: Québec, Canada

Re: Zigbee - XBee + Raspberry Pi sans arduino

Mon Dec 02, 2013 1:54 am

Branché avec le régulateur LE33CZ comme la photo du post précédent, j'ai le login de la console que j'ai modifié pour 9600 baud.

sudo nano /etc/inittab

Code: Select all

#Spawn a getty on Raspberry Pi serial line
#T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100
T0:23:respawn:/sbin/getty -L ttyAMA0 9600 vt100
Une fois modifié, J'ai fait un reboot. (Étrange init q ne marchait pas).

Image

Daniel

danjperron
Posts: 3522
Joined: Thu Dec 27, 2012 4:05 am
Location: Québec, Canada

Re: Zigbee - XBee + Raspberry Pi sans arduino

Wed Dec 04, 2013 12:49 am

Salut Nathonline,


J'ai acheté précisément deux Xbees modules pour mettre en sans-fil un vieux système que j'ai fait il y a de cela 6 ans.

Un ami à moi m'a donné deux de ces vieux aspirateurs Roomba. Ils ne fonctionnaient plus. J'ai réussi à réparer le vieux modèle, un de la série 400. J'ai changé la batterie! ouff très difficile comme réparation.

J'ai eu le même modèle auparavant. Ce modèle n'avait pas d'horloge interne mais pouvait être allumé avec une télécommande. J'ai donc fait, avec un micro-processeur, un convertisseur qui transpose les caractères ascii en code de la télécommande. Maintenant que j'ai de nouveau ce robot, j'ai décidé de l'utiliser au deuxième étage de ma maison puisque le premier ce fait avec mon roomba actuel qui a une horlorge interne.

Le problème sera de communiquer avec la boîte noire sans utiliser de fil. J'ai donc pensé à utiliser deux Xbees modules.
Ce sont des séries 2 donc il y en a un en coordinateur. J'ai donc configuré les Xbees en conséquence avec un PC puisque la configuration ce fait avec une application PC.

Ensuite j'ai branché le Xbee, mode router/end , sur le port série ttyAMA0 du Raspberry PI et branché le coordinateur sur le port usb avec l'adaptateur DFrobot, (robotshop RB-Dfr-148). Pour l'instant le coordinateur sera sur le port usb avec le Raspberry Pi.
L'autre Xbee sera avec le convertisseur optique. (La télécommande ASCII).

Image


Pour tester les deux Xbees avec le Rpi, j'utilise minicom avec deux consoles. (apt-get install minicom)

La première console ouvre minicom pour le router/end Xbee.

Code: Select all

minicom -D /dev/ttyAMA0 -b 9600
P.S. Il faut désactiver la console login de ttyAMA0 dans inittab. Ajoutez le caractère # et faire un reboot.

Code: Select all

#T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100
La deuxième console ouvre minicom pour le coordinateur sur l'adaptateur USB.

Code: Select all

minicom -D /dev/ttyACM0 -b 9600
Voici un vidéo que j'ai fait il y a 6 ans de cela. (La webcam n'avait pas de filtre infra-rouge. Les capteurs sont donc visibles).

https://dl.dropboxusercontent.com/s/p4f ... roomba.wmv

Image
Image

Le schéma
https://dl.dropboxusercontent.com/s/hnj ... c_v1_1.pdf

Le code source du cpu

Code: Select all

/*   

    Copywright 2007 Daniel Perron


    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.


*/


/*  



    Author : Daniel Perron
	Date   : 28 October 2007

    Version : 1.1
	Name : ir.c  
  
     
	Compiler used :  SDCC ( may 31 2007)

    How to compile:  
                        sdcc --model-small --iram-size 128 --data-loc 0x20 ir.c
                        packihx ir.ihx > ir.hex




    Description:     Send ,from rs-232 , ir command to roomba cleaner robot


    - Normal mode. Send a string of command , maximum of 24 characters, ended by a cariage return.

    - Direct mode. Execute command one character at the time.
	


     Caracter command;

   			  F		-> Send I.R. forward.
			  L		-> Send I.R. left.
			  R		-> Send I.R. right.
			  P		-> Send I.R. power.
			  D		-> Send I.R. dock.
			  C		-> Send I.R  clean.
			  M		-> Send I.R. maximum clean.
			  S		-> Send I.R. spot clean.
			  #hh	-> Send I.R. Raw data where hh is a 8 bits hexadecimal value.
  			  A		-> Power ON base station.
			  Z		-> Power OFF base station.
			  W		-> Wait NTimes * 100ms.
			  1..9	-> set NTimes value. NTimes=1 to 9.
			  !		-> Enter direct mode.
              ESC	-> Exit from direct mode.



     P.S. any data is send NTimes.  A command like "5ZWWWWPWCA" will turn off base station, wait 2 seconds,Power ON roomba,Wait half of second,
	                                start clean command and finally power up base station again. The Ir command is send Ntimes without gap.
									This ensure that the command is received by the I.R. receiver. On this sample NTimes is equal to 5.
									Ntimes could be change at any times like "9W1W5P5W".  Ntimes= 1..9; (only one digit number,Zero excluded).



     Processor:  at80c2051 at 11.0592Mhz.  20 pins Atmel 8051 familly processor
  
     Port 1 bit 0..7	-> Output -> All I.R. Led signal.
	 Port 3 bit 7		-> Outout -> Base station Relay.
	 Port 3 bit 5		-> Input  ->  0 = Disable Txm , 1 = Enable Txm.



*/
     


#include <at89x51.h>

#define LEDS P1
#define BASE_STATION P3_7

#define TransmitEnable P3_5

#include <stdio.h>
#include <ctype.h>



bit BitHigh;

bit DirectMode;


#define TOKEN_NONE			0
#define TOKEN_IR			1
#define TOKEN_NTIMES		2
#define TOKEN_WAIT			3
#define TOKEN_DIRECT_MODE	4
#define TOKEN_BREAK			5
#define TOKEN_HELP			6
#define TOKEN_STATION_OFF	7
#define TOKEN_STATION_ON	8
#define TOKEN_DATA			9
#define TOKEN_DATA_HNIBBLE	10
#define TOKEN_DATA_LNIBBLE	11

unsigned char TokenType;

unsigned char TxmHeader;
unsigned char TxmData;
unsigned char RcvData;
unsigned char TxmBitCount;
unsigned char NTimes;

unsigned char RawIrData;
unsigned char Timer10ms;
unsigned char TimerCountDown;



// be carefull  String are store in unused
// data memory gap. The  working register block  2,3 and 4
#define STRING_MAX 24
__data __at (0x8) unsigned char String[STRING_MAX]  ;




unsigned char StringCount;

void Delay_off(unsigned char  count)
{
  unsigned char loop;

     LEDS=0xff; // leds off
   for(loop=0;loop<count;loop++)
   {
     _asm    nop
             nop
             nop
             nop
             nop
             nop
             nop
             nop
				 nop
             nop
             nop
             nop
             nop
             nop
             nop
             nop
     _endasm;
     }

}


void Delay_on(unsigned char count)
{
  unsigned char loop;


  // 11.0592Mhz / 12 =  921600 cycles/sec
  // 921600 cycle/sec / 38400 Hertz  = 24 Cycles

   for(loop=0;loop<count;loop++)    // 8 cycles for loop
   {
     LEDS=0; // led on              // 2 cycles
     _asm    nop                    // nop is 1 cycle
             nop
             nop
             nop
             nop
             nop
             nop
             nop
             nop
             nop

     _endasm;
     LEDS=0xff; // led off          // 2 cycles
     _asm    nop
             nop
     _endasm;
     }

}




const char * StringHelp =   "\r\n"\
							"=================================\r\n"\
						 	" IR remote\r\n"\
                            " D.J.P. V1.1, 12 Oct 2007.\r\n"\
							"=================================\r\n"\
							" F   -> Forward\r\n"\
							" L   -> Left\r\n"\
							" R   -> Right\r\n"\
							" P   -> Power\r\n"\
							" D   -> Dock\r\n"\
							" C   -> Clean\r\n"\
							" M   -> Max clean\r\n"\
							" S   -> Spot clean\r\n"\
							" A   -> Base Station ON\r\n"
							" Z   -> Base Station OFF\r\n"
							"#hh  -> Send I.R. Raw data\r\n"
							"        where hh = byte hex value\r\n"
							" !   -> Enter interactive mode \r\n"
							" W   -> wait NTIMES * 100 ms\r\n"
							"1..9 -> Set NTimes values\r\n"
							"=================================\r\n"\
							"\r\n";



void SendIr(unsigned char Data)
{

  TxmHeader= 0x4a; // roomba header
  TxmData= Data;



     for(TxmBitCount=16;TxmBitCount>0;TxmBitCount--)
            {

                __asm
                        mov A,_TxmData
                        rlc A
                        mov _TxmData,A
                        mov A,_TxmHeader
                        rlc A
                        mov _TxmHeader,A
                        mov _BitHigh,C;
                __endasm;


               if(BitHigh)
                 {
                    Delay_on(114); // 38Khz  for 3 ms
                    Delay_off(38);  // 38Khz for 1ms
                 }
               else
                  {
                    Delay_on(38);    // 38Khz  for 1 ms
                    Delay_off(114);  //  38Khz for 3 ms
                  }

            }
             Delay_off(152);

}


void NSendIr(unsigned char Data)
{
  unsigned char loop;

  if(NTimes==0) NTimes=1;
  if(NTimes>9)  NTimes=9;

  for(loop=0;loop<NTimes;loop++)
     SendIr(Data);
}



void printerror()
{
if(TransmitEnable)
{
	TI=0;
	SBUF='X';
	while(!TI);
}
}


void printchar(char value)
{
if(TransmitEnable)
{
	TI=0;
	SBUF=value;
	while(!TI);
}
}


void print(const char * String)
{
if(TransmitEnable)
{
  while(*String)
  {
   TI=0;
   SBUF= *(String++);
   while(!TI);
  }
}
}


void printNibble(unsigned char value)
{
if(TransmitEnable)
{
 	value = value & 0xf;
	if(value >9) value += 'A' - 10;
	else value += '0';
	TI=0;
	SBUF=value;
	while(!TI);
}
}

void printHex(unsigned char value)
{
if(TransmitEnable)
{
    print("0x");
	printNibble(value >> 4);
	printNibble(value);
}
}


unsigned char GetHex(unsigned char value)
{
	if( value < '0' ) return(16);
	if(!( value > '9')) return(value - '0');
	if(!( value < 'A' ))  
		if(!(value > 'F' ))
			return(value - 'A' + 10);
	return(16);
}






unsigned char GetCommand(unsigned char value)
{

	unsigned char IrData;

value= toupper(value);

   if((TokenType == TOKEN_DATA) || (TokenType == TOKEN_DATA_HNIBBLE))
   {
	   IrData = GetHex(value);
       RawIrData = RawIrData * 16;
	   RawIrData += IrData;
	   if(IrData == 16) TokenType = TOKEN_NONE;
	   else if(TokenType == TOKEN_DATA) TokenType= TOKEN_DATA_HNIBBLE;
	   else TokenType = TOKEN_DATA_LNIBBLE;
	   return(RawIrData);
   }


 if(value > '0')
  if(value < ':')
   {
    TokenType= TOKEN_NTIMES;
    return(value - '0');
   }

TokenType= TOKEN_IR;

   

  switch(value)
  {

 case 'F':  return(130);
 case 'L':  return(129);
 case 'R':  return(131);
 case 'P':  return(138);
 case 'D':  return(143);
 case 'C':  return(136);
 case 'M':  return(133);
 case 'S':  return(132);
 case 'H':
	        if(DirectMode)
				TokenType=TOKEN_HELP;
 		   else
			    TokenType=TOKEN_NONE;
            break;
case 'W':
            TokenType=TOKEN_WAIT;
			break;

case 'Z':
	        TokenType=TOKEN_STATION_OFF;
			break;
case 'A':   TokenType=TOKEN_STATION_ON;
	        break;

case '#':   TokenType=TOKEN_DATA;
	        break;

case '!':   TokenType=TOKEN_DIRECT_MODE;
	        break;

case 27:	TokenType=TOKEN_BREAK;
	        break;

default:   // any unknowned command send 'X' back
           TokenType=TOKEN_NONE;

}

return 0;
}



unsigned char ExecuteToken(unsigned char Token,unsigned char value)
{

	unsigned char  loop2;
	unsigned char  loopNtimes;

	switch(Token)
			{
			case  TOKEN_IR:  
				             NSendIr(value); break;
			case  TOKEN_NTIMES: NTimes=value; break;
			case  TOKEN_WAIT:   
				                     for(loopNtimes=0;loopNtimes<NTimes;loopNtimes++)
									 for(loop2=0;loop2<100;loop2++)
										 Delay_off(38);
									 break;

			case  TOKEN_STATION_OFF: BASE_STATION= 1; break;

			case  TOKEN_STATION_ON: BASE_STATION= 0; break;

            case  TOKEN_BREAK:      DirectMode=0;
									StringCount=0;
									break;
			case  TOKEN_DIRECT_MODE: DirectMode=1;
									StringCount=0;
									break;
			case  TOKEN_DATA: 
			case  TOKEN_DATA_HNIBBLE: break;

			case  TOKEN_HELP:         print(StringHelp);
				                      return(0);
				                      break;

			case  TOKEN_DATA_LNIBBLE:
				                      NSendIr(RawIrData); break;
								 
			default:
                StringCount=0;
				printerror();
				return(0);



            }

   return 1;


}


unsigned char GetStringToken(void)
{

	unsigned char  loop;
	unsigned char  value;
	if(RcvData== '\r')
	{


		for(loop=0;loop<StringCount;loop++)
		{

            value=GetCommand(String[loop]);
			if(!ExecuteToken(TokenType,value))
			{
				printerror();
				StringCount=0;
				return(0);
			}
		}
		StringCount=0;
		printchar('.');

	}
	else
	{

		          if(StringCount < STRING_MAX)
				  {
				  String[StringCount++]=RcvData;
  				  printchar(RcvData);; // ok string command ok echo it
				  }
				  else
				  {
				   StringCount=0;
				   printerror();
	   				return(0);

				  }

	}

	return(1);
}



void main(void)
{
 unsigned char value;

	
  LEDS=0xff;   // turn led off
  NTimes=3;    // In debug mode send the character 5 times.

 DirectMode=0; // StringCode mode off

 BASE_STATION=0;
 
 StringCount=0;
 TokenType= TOKEN_NONE;

 
  // init serial

  ES=0;  // disable serial
 /* PCON BIT 7 DOUBLE THE BAUD RATE IF SET */
 /* PCON=PCON AND 7FH */
 /* DOUBLE BAUD RATE */


 // set 8bit data

 SCON = 0x50;

 TR1  = 1;	// enable t1
 TR0  = 0;
// // TR0  = 1;  // enable t0 has wait timer

 
 //TH1=0xFD;  //9600baud for 11.0592Mhz

 TH1= 0xE8;   //1200 baud

// // TH0= 0xDB;   // set 16bit counter  at 9216 to get 10 ms timeout flag


// // TMOD = 0x21;  // T1 has baud rate T0 has 16 bit timer
TMOD = 0x20;

PT0= 1;
TR0= 1;
ET0= 0;
RI=0;
EA=1;

//   print(StringStart);

  while(1)
   {
        if(RI)  // ARE we getting character from rs 232
         {

            RcvData= SBUF;   // caracter to transfer
            RI=0;
			if(RcvData == 10) continue;
			if(DirectMode)
			{

                 value=GetCommand(RcvData);
				if(TokenType==TOKEN_NONE)
					printerror();
				 else
				 {
				 if(ExecuteToken(TokenType,value))
					 printchar(RcvData);
				 }

			}
			else
			{
			  if(!GetStringToken())  // GetStringCodeCommand
				  {
					  //ok bad command or buffer full
					  // forget string command
					  TokenType=TOKEN_NONE;
					  StringCount=0;
					  continue;
				  }
			 }
		}
   }
}

Maintenant il me reste à ajouter le Xbee à l'entrée de l'isolateur optique. Peut être le mieux serait d'enlever l'isolateur et de brancher directement le Xbee sur le micro-processeur tout en changeant le régulateur à 3.3V au lieu de 5V. (le cpu peut rouler à cette tension).

Daniel
Last edited by danjperron on Fri Sep 07, 2018 11:58 pm, edited 1 time in total.

danjperron
Posts: 3522
Joined: Thu Dec 27, 2012 4:05 am
Location: Québec, Canada

Re: Zigbee - XBee + Raspberry Pi sans arduino

Fri Dec 06, 2013 12:08 am

Je n'ai pas été capable d'insérer le XBee à l'intérieur de la boîte.
Image

Je vais trouver un couvercle en plastique pour solidifier le tout.

Toutefois j'ai inséré le régulateur 3.3V, (LE33CZ) , dans le boîtier et J'ai soudé le commun et le 3.3V sur les pins 1 et 6 du DB-9.

J'ai ensuite modifié le code source , vieux de six ans , en C pour la périphérique /dev/ttyACM0 ( l'adaptateur usb pour le coordonateur).

voici le code source

Code: Select all

#include <stdlib.h>
#include <string.h>
#include <termios.h>
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/signal.h>
#include <sys/types.h>
#include <signal.h>


// serial port definition

long BAUD=B1200;                      // derived baud rate from command line
long DATABITS=CS8;
long STOPBITS=0;
long PARITYON=0;
long PARITY=0;

int RemoteHandle;
char SerialPortName[]= "/dev/ttyACM0";


int main(int argc, char * argv[])
{
struct termios oldtio, newtio;
 char buffer[256];
 int count;
 int loop;

 if(argc!=2)
{
 printf("usage:\n\t roomba_ir \"String command\"\n");
 printf("\r\n"\
	"=================================\r\n"\
	" IR remote\r\n"\
	" D.J.P. V1.1, 12 Oct 2007.\r\n"\
	"=================================\r\n"\
	" F   -> Forward\r\n"\
	" L   -> Left\r\n"\
	" R   -> Right\r\n"\
	" P   -> Power\r\n"\
	" D   -> Dock\r\n"\
	" C   -> Clean\r\n"\
	" M   -> Max clean\r\n"\
	" S   -> Spot clean\r\n"\
	" A   -> Base Station ON\r\n"\
	" Z   -> Base Station OFF\r\n"\
	"#hh  -> Send I.R. Raw data\r\n"\
	"        where hh = byte hex value\r\n"\
	" !   -> Enter interactive mode \r\n"\
	" W   -> wait NTIMES * 100 ms\r\n"\
	"1..9 -> Set NTimes values\r\n"\
	"=================================\r\n"\
	"\r\n");										
 return(1);
}



  RemoteHandle  = open(SerialPortName,O_RDWR | O_NOCTTY /*| O_NDELAY | O_NONBLOCK */);

  if(RemoteHandle<0)  
 {
 printf("Unable to open serial port '%s'\n",SerialPortName);
  return(2);
}
 


    tcgetattr(RemoteHandle,&oldtio);
    newtio.c_cflag = BAUD |  DATABITS | STOPBITS | PARITYON | PARITY | CLOCAL; //| CREAD;

     newtio.c_iflag = IGNPAR;
     newtio.c_oflag = 0;
     newtio.c_lflag = 0;       //ICANON;
     newtio.c_cc[VMIN]=0;
     newtio.c_cc[VTIME]=0;
     tcflush(RemoteHandle, TCIFLUSH);
     tcsetattr(RemoteHandle,TCSANOW,&newtio);

    usleep(80000);

    strcpy(buffer,argv[1]);
    count= strlen(argv[1]);

    buffer[count]=13;
    buffer[++count]=0;

    printf("Command IR: ");
    for(loop=0;loop<count;loop++)
    {
    write(RemoteHandle,&buffer[loop],1);
//    tcflush(RemoteHandle,TCIFLUSH);
    printf("%c",buffer[loop]);  
    tcdrain(RemoteHandle);
    usleep(50000);
    fflush(stdout);
    }

   tcdrain(RemoteHandle);   
   usleep(50000);
   // ok close everything
    
    tcsetattr(RemoteHandle,TCSANOW,&oldtio);
     close(RemoteHandle);


 return(0);
}

et j'ai créé un script bash pour activer le roomba en mode clean

Code: Select all

root@PiA2:/usr/local/bin# cat RoombaClean
#!/bin/bash

/usr/local/bin/roomba_ir AWWWWWWW9PWWWWCW

exit 0
explication de l'argument du script.
A = Station de base ON
wwwwwww = attendre 7 secondes
9P = envoyer 9 pulsations de la commande (Allumer la roomba)
wwww = attendre 4 secondes
C = envoyer la commande "Nettoyer"
w = attendre 1 seconde.

Et maintenant il me reste à installer webiopi ou lighthttpd pour mettre le tout sur la page web

Daniel
Last edited by danjperron on Fri Sep 07, 2018 11:50 pm, edited 1 time in total.

danjperron
Posts: 3522
Joined: Thu Dec 27, 2012 4:05 am
Location: Québec, Canada

Re: Zigbee - XBee + Raspberry Pi sans arduino

Sun Dec 08, 2013 7:44 pm

Et finalement le code Web.

J'ai installé lighttpd.

Modifié la configuration pour permettre l'exécution de perl qui va géré la communication série.

Code: Select all

 cat /etc/lighttpd/conf-available/10-cgi.conf
# /usr/share/doc/lighttpd/cgi.txt

server.modules += ( "mod_cgi" )

$HTTP["url"] =~ "/cgi-bin/" {
	cgi.assign = (".pl" => "/usr/bin/perl")
}
Créé une page web

Code: Select all

 cat /var/www/index.html
<html>
<head>
 <title> roomba ir remote </title>

<script type="text/javascript">
  function SendCommand(val)
  {
   self.location='/cgi-bin/roomba_ir.pl?ir=' + val;
  }
</script>
</head>
<body>

<br><br><br><BR>

 <button OnClick=SendCommand("ZW9PWW5CWWWWWAW")>Nettoyer</button>
 <br>

 <button OnClick=SendCommand("Z9WWWWW7PWWWW7DAW")>Amarrer</button>
 <br>

 <button OnClick=SendCommand("Z")>Base de charge OFF</button>
 <br>

 <button OnClick=SendCommand("A")>Base de charge ON</button>
 <br>

 <button OnClick=SendCommand("6P1W")>ON/OFF</button>
 <br>


 
</body>
</html>
Ajouté un répertoire cgi-bin

Code: Select all

sudo mkdir /var/www/cgi-bin
et Créé le code perl

Code: Select all

cat /var/www/cgi-bin/roomba_ir.pl
#!/usr/bin/perl
use warnings;
use strict;
use Device::SerialPort;
use CGI;

my $Xbee = new Device::SerialPort("/dev/ttyACM0");
my $query = CGI->new;

print "Content-Type: text/html\r\n\r\n";
print "<HTML><HEAD><TITLE>GET Variables</TITLE>";
print "</HEAD><BODY>";
print "Sending command to ROOMBA ...<br>";
$| = 1;

$Xbee->user_msg('ON');
$Xbee->baudrate(1200);
$Xbee->parity("none");
$Xbee->databits(8);
$Xbee->stopbits(1);
$Xbee->handshake("none");
$Xbee->write_settings;

#print $query->param('ir');
#$Xbee->write($query->param('ir'));
#$Xbee->write("\r\n");
my $str = $query->param('ir');
my $size = length $str;

for ( my $l = 0 ;$l< $size; $l+=1){
 $Xbee->write(substr($str,$l,1));
 print substr($str,$l,1);
 $| = 1;
 select(undef,undef,undef,0.1);
}
$Xbee->write("\r");
sleep 1;
$Xbee->close();
print "<br>Done!";
print "</BODY></HTML>";
exit 0;
modifié le groupe pour /dev/ttyACM0

Code: Select all

sudo chgrp www-data /dev/ttyACM0
Je pense que c'est un bon exemple. Du moins une façon d'utiliser le Xbee.

Daniel


Return to “Français”