Go Down

Topic: Prime Armi.. Dati su Rs485 (Read 861 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
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy