home | area personale         schemi | tutorial | robotica | pic micro | recensioni         forum | chat irc         faq | contatti         store | Ordina PCB
username
password
cerca

 
FORUM: Pic Micro
Tutto quanto riguarda questi microprocessori... progetti, suggerimenti, aiuti, discussioni...ecc


Rieccomi con l'arducoso.
     
Autore Messaggio opzioni
FrancoGual



[pagine pubblicate]

postato il:
25.04.2023, alle ore 21:42
Rieccomi con l'arducoso. 

Ed eccomi con un'altra domanda arducosa.
Intento Buon 25 Aprile.
Oggi riparavo una dome dell'impianto TVS di casa.E sono incappato in un vecchio problema.
Nonostante il DVR sia di marca , Hikvision, non ha i preset interni per collegare un evento ad una azione.
Spiego meglio, una telecamera fissa guarda il viale e fornisce un allarme (evento) all'attraversamento di una linea, se arriva qualcuno scatta se va via non accade nulla, all'evento una delle dome si dirige , tramite preset, al punto interessato, dando una ulteriore inquadratura.
Questo accadeva con un DVR cinese di infima qualità, con un prestigioso Hilvision questo non si può fare.
Ho messo insieme un arduino che pilota le dome ma non riesco a creare un comando di richiamo preset.
In tutto il web pare che nessuno ne abbia necessità, tutti vogliono il controllo PTZ, come se comprassi una dome per posizionarla fissa.
Allego il codice che ho usato, segue la domanda.
 #include <SoftwareSerial.h>

const byte rxPin = 3;
const byte txPin = 4;

SoftwareSerial SerialRS = SoftwareSerial(rxPin, txPin);

const int LED = 13;

const int P_LEFT = 10;    //left
const int P_UP = 11;      //up
const int P_RIGHT = 9;   //right
const int P_DOWN = 12;     //down
const int P_ZOOM_IN = 8;  //zoom in
const int P_ZOOM_OUT = 7; //zoom out
const int P_PRESET = 6; //preset1 prova

const byte address = 1; //camera address
byte speed = 15; // can be changed by pressing left+up or left+down Disabilitato

const byte C_STOP = 0x00;
const byte C_UP = 0x08;
const byte C_DOWN = 0x10;
const byte C_LEFT = 0x04;
const byte C_RIGHT = 0x02;
const byte C_PRESET = 0xF7;


const byte C_ZOOMIN = 0x20;
const byte C_ZOOMOUT = 0x40;

const byte C_SET_PAN_POSITION = 0x4B;  // 1/100ths of degree
const byte C_SET_TILT_POSITION = 0x4D; // 1/100ths of degree

bool stoped = false;

void setup()
{
  pinMode(LED, OUTPUT);

  pinMode(P_LEFT, INPUT);     //left
  pinMode(P_UP, INPUT);       //up
  pinMode(P_RIGHT, INPUT);    //right
  pinMode(P_DOWN, INPUT);     //down
  pinMode(P_ZOOM_IN, INPUT);  //zoom in
  pinMode(P_ZOOM_OUT, INPUT); //zoom out
  pinMode(P_PRESET, INPUT); //preset1 prova

  Serial.begin(9600);
  SerialRS.begin(4800);
  Serial.println("Pelco D cont. 4800 N 8 1");

  sendPelcoDFrame(C_STOP, 0, 0);
  delay(10);
  sendPelcoDFrame(C_SET_PAN_POSITION, 23, 28);

  blinkLED();
}

void loop()
{
/* // chiamare preset " Call Preset  0xFF  Address 0x00  0x07  0x00  Preset ID SUM"
  if (check(P_LEFT) && check(P_DOWN))
  {
    speed = speed - 10;
    if (speed < 0)
      speed = 0;
    Serial.print("Speed:");
    Serial.println(speed);
    blinkLED();
    delay(1000);
    return;
  }

  if (check(P_LEFT) && check(P_UP))
  {
    speed = speed + 10;
    if (speed > 255)
      speed = 255;
    Serial.print("Speed:");
    Serial.println(speed);
    blinkLED();
    delay(1000);
    return;
  }
  */

  if (check(P_LEFT))
  {
    sendPelcoDFrame(C_LEFT, speed, speed);
    Serial.println("left");
    stoped = false;
  }
  else if (check(P_RIGHT))
  {
    sendPelcoDFrame(C_RIGHT, speed, speed);
    Serial.println("right");
    stoped = false;
  }
  else if (check(P_UP))
  {
    sendPelcoDFrame(C_UP, speed, speed);
    Serial.println("up");
    stoped = false;
  }
  else if (check(P_DOWN))
  {
    sendPelcoDFrame(C_DOWN, speed, speed);
    Serial.println("down");
    stoped = false;
  }
  else if (check(P_ZOOM_IN))
  {
    sendPelcoDFrame(C_ZOOMIN, 0, 0);
    Serial.println("zoom in");
    stoped = false;
  }
  else if (check(P_ZOOM_OUT))
  {
    sendPelcoDFrame(C_ZOOMOUT, 0, 0);
    Serial.println("zoom out");
    stoped = false;
  }
  else if (check(P_PRESET))
  {
    sendPelcoDFrame(C_PRESET,speed,speed);
    Serial.println("preset1");
    stoped = false;
  }
  else
  {
    if (!stoped)
    {
      sendPelcoDFrame(C_STOP, 0, 0); //Call Preset 0xFF  Address 0x00  0x07  0x00  Preset ID SUM
      delay(10);
      sendPelcoDFrame(C_STOP, 0, 0);
      Serial.println("stop");
      stoped = true;
    }
  }

  if (!stoped)
  {
    digitalWrite(LED, HIGH);
  }
  else
  {
    digitalWrite(LED, LOW);
  }

  delay(100);
}

bool check(int pin)
{
  return (digitalRead(pin) == HIGH);
}

void sendPelcoDFrame(byte command, byte data1, byte data2)
{
  byte bytes[7] = {0xFF, address, 0x00, command, data1, data2, 0x00};
  byte crc = (bytes[1] + bytes[2] + bytes[3] + bytes[4] + bytes[5]) % 0x100;
  bytes[6] = crc;

  for (int i = 0; i < 7; i++)
  {
    SerialRS.write(bytes[i]);
     Serial.print(bytes[i], HEX); //debug
     Serial.print(bytes[i], DEC); //debug
  }
   Serial.println(); //debug
}

void blinkLED()
{
  for (int i = 0; i < 4; i++)
  {
    digitalWrite(LED, HIGH);
    delay(100);
    digitalWrite(LED, LOW);
    delay(100);
  }

Io sostituirei tutti i comandi di input con preset , solo che questo non lo fa.
I manuali PELCO D, appunto il protocollo usato, dicono quanto segue.
 
Set Preset 0xFF Address 0x00 0x03 0x00 Preset ID SUM
Clear Preset 0xFF Address 0x00 0x05 0x00 Preset ID SUM
Call Preset 0xFF Address 0x00 0x07 0x00 Preset ID SUM 

Dove oxFF è fisso, Address è l'indirizzo 485, 0x00 fisso,0x07 comando call preset,0x00 anch'esso zero, poi il valore del preset, infine il checksum.
Senza di esso(corretto) il comando non verrà eseguito.
Ho provato a inserire il comando, ma a debug mi pare la stringa non viene costruita correttamente.
Quindi aspetto domande, critiche, correzioni ecc ecc..
Grazie della pazienza.



Anche il viaggio più lungo inizia con un piccolo passo.
Si vis pacem, para bellum!!!
Mark Zuckerberg ha reso suoi schiavi milioni di persone senza che se ne rendessero conto. F.G.
<Avete vinto voi,ma almeno non riuscirete a considerarmi vostro complice> Da Mediterraneo.
Inferno,Canto III,verso 51 Virgilio dice.........
FrancoGual



[pagine pubblicate]

postato il:
30.04.2023, alle ore 17:34
Risolto, grazie a tutti.


Anche il viaggio più lungo inizia con un piccolo passo.
Si vis pacem, para bellum!!!
Mark Zuckerberg ha reso suoi schiavi milioni di persone senza che se ne rendessero conto. F.G.
<Avete vinto voi,ma almeno non riuscirete a considerarmi vostro complice> Da Mediterraneo.
Inferno,Canto III,verso 51 Virgilio dice.........
segui questo thread con grixFC, per questa funzione devi aver installato il software grixFC

torna su
     

Come utente anonimo puoi leggere il contenuto di questo forum ma per aprire una discussione
o per partecipare ad una discussione esistente devi essere registrato ed accedere al sito




 







 
 
indietro | homepage | torna su copyright © 2004/2024 GRIX.IT - La community dell'elettronica Amatoriale