Pages: [1]   Go Down
Author Topic: Prime Armi.. Dati su Rs485  (Read 776 times)
0 Members and 1 Guest are viewing this topic.
0
Offline Offline
Jr. Member
**
Karma: 0
Posts: 79
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 5
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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(smiley-cool
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?
Logged

Pages: [1]   Go Up
Jump to: