Go Down

Topic: Prime Armi.. Dati su Rs485 (Read 782 times) previous topic - next topic

Giorgio

Salve a tutti,
devo ancora acquistare le mie prime schede,
e proprio per questo approfitto della vostra gentilezza per chiedere se è possibile fare quanto segue.

Avrei la necessità di pilotare da 1 a 10 relais mediante Arduino,
interpretando dei semplici comandi ricevuti su una RS485.

In buona sostanza,avrei la necessità che Arduino,ricevuto un comando tipo "P11" sulla seriale 485 accendesse e tenesse acceso il relais 1,una volta ricevuto il comando P10 lo spegnesse,stessa cosa con i comandi P21 e P20 per il relais 2 e cosi via...

E' facilmente fattibile con Arduino?
E' fattibile anche da un principiante?
Sareste anche magari così gentili da indicarmi quale hardware acquistare?

grazie infinite a tutti,

Giorgio

Andrea Ivetich

ti puo essere utile?

//------------------------------------------------------

/*
* File:   RS485.h
* Author: andrea ivetich
* andrea.ivetich@alice.it
*
* Created on 26 ottobre 2010, 11.55
*/

#include <inttypes.h>
#include "HardwareSerial.h"
/*
usare con integrato 8 piedini MAX485
con arduino mega si possono utilizzare 4 integrati MAX485
collegare come segue:

arduino                              MAX488
busy_pin            <-->      RE(2) e DE(3) in corto
RX                        <-->      RO(1)
TX                        <-->      DI(4)
5v                        <-->      VCC(8)
GND                        <-->      GND(5)

rete 485                        MAX485
linea_485_A            <-->      A(6)
linea_485_B            <-->      B(7)

definire il metodo flush virtuale... cosi:
nella file HardwareSerial.h aggiungere la parola virtual..
in modo da avere
virtual void flush(void);

e aggiungere la seguenti righe i modo da poter "overloadare" la classe

extern ring_buffer rx_buffer;
#if defined(__AVR_ATmega1280__)
extern ring_buffer rx_buffer1;
extern ring_buffer rx_buffer2;
extern ring_buffer rx_buffer3;
#endif

*/

#define RS485Port_busy_pin_0      2
#define RS485Port_busy_pin_1      21
#define RS485Port_busy_pin_2      4
#define RS485Port_busy_pin_3      6

class RS485Port : public HardwareSerial {
public:
   RS485Port(ring_buffer *rx_buffer,
           volatile uint8_t *ubrrh, volatile uint8_t *ubrrl,
           volatile uint8_t *ucsra, volatile uint8_t *ucsrb,
           volatile uint8_t *udr,
           uint8_t rxen,
           uint8_t txen,
           uint8_t rxcie,
           uint8_t udre,
           uint8_t u2x,
           int busy_pin);
   void begin(long);
   void flush(void);
private:
   int bp;
};

/*
extern RS485Port Serilal_485;

#if defined(__AVR_ATmega1280__)
extern RS485Port Serial1_485;
extern RS485Port Serial2_485;
extern RS485Port Serial3_485;
#endif
*/

//---------------------------------------------

/*
* File:   RS485.cpp
* Author: andrea ivetich
* andrea.ivetich@alice.it
*
* Created on 26 ottobre 2010, 11.55
*/

#include <stdlib.h>
#include "wiring.h"
#include "RS485.h"

RS485Port::RS485Port(
       ring_buffer *rx_buffer,
       volatile uint8_t *ubrrh, volatile uint8_t *ubrrl,
       volatile uint8_t *ucsra, volatile uint8_t *ucsrb,
       volatile uint8_t *udr,
       uint8_t rxen,
       uint8_t txen,
       uint8_t rxcie,
       uint8_t udre,
       uint8_t u2x,
       int busy_pin)
: HardwareSerial(rx_buffer, ubrrh, ubrrl, ucsra, ucsrb, udr, rxen, txen, rxcie, udre, u2x) {
   bp = busy_pin;
}

void RS485Port::begin(long b) {
   HardwareSerial::begin(b);
   pinMode(bp, OUTPUT);
   digitalWrite(bp, LOW);
}

void RS485Port::flush(){
   digitalWrite(bp, HIGH);
   HardwareSerial::flush();
   delay(30);
   digitalWrite(bp, LOW);
}

/*
#if defined(__AVR_ATmega8__)
RS485Port Serial_485(&rx_buffer, &UBRRH, &UBRRL, &UCSRA, &UCSRB, &UDR, RXEN, TXEN, RXCIE, UDRE, U2X, RS485Port_busy_pin_0);
#else
RS485Port Serial_485(&rx_buffer, &UBRR0H, &UBRR0L, &UCSR0A, &UCSR0B, &UDR0, RXEN0, TXEN0, RXCIE0, UDRE0, U2X0, RS485Port_busy_pin_0);
#endif

#if defined(__AVR_ATmega1280__)
RS485Port Serial1_485(&rx_buffer1, &UBRR1H, &UBRR1L, &UCSR1A, &UCSR1B, &UDR1, RXEN1, TXEN1, RXCIE1, UDRE1, U2X1, RS485Port_busy_pin_1);
RS485Port Serial2_485(&rx_buffer2, &UBRR2H, &UBRR2L, &UCSR2A, &UCSR2B, &UDR2, RXEN2, TXEN2, RXCIE2, UDRE2, U2X2, RS485Port_busy_pin_2);
RS485Port Serial3_485(&rx_buffer3, &UBRR3H, &UBRR3L, &UCSR3A, &UCSR3B, &UDR3, RXEN3, TXEN3, RXCIE3, UDRE3, U2X3, RS485Port_busy_pin_3);
#endif
*/

Ciao?

Go Up