• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Arduino optoizolator problem
#1
Witam,

Mam problem z układem który stworzyłem. Założenie jest następujące:
Arduino mega odczytuje sygnał wejściowy za pośrednictwem modułu z optoizolatorami https://elektroweb.pl/pl/optoizolatory/1548-optoizolator-8-kanalowy-pc817-izolator-galwaniczny-3-24v.html?gad_source=1&gclid=Cj0KCQjw_JzABhC2ARIsAPe3ynrnxAVrsarojvMVJDUdlDgagF7LzOnHZAoDP1vd1fr-_zLwE7goBVQaAtskEALw_wcB.

Sygnał wejściowy pochodzi z zewnętrznego urządzenia niezależnego od mojego układu. Sygnał z urządzenia 5v. Na odstawie sygnału wejściowego arduino załącza przekaźniki na module 8 kanałów oraz steruje serwami. Problem jest w losowym działaniu, arduino raz pracuje odpowiednio a raz zaczyna mieszać i załączać losowo. Czy jest to kwestia kodu?

Kod:
#include <Wire.h>
#include <Adafruit_PWMServoDriver.h>
#include <SPI.h>

Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();

#define USMIN  600 // This is the rounded 'minimum' microsecond length based on the minimum pulse of 150
#define USMAX  2400 // This is the rounded 'maximum' microsecond length based on the maximum pulse of 600
#define SERVO_FREQ 50 // Analog servos run at ~50 Hz updates

// our servo
uint8_t servonum1 = 1;
uint8_t servonum2 = 2;
uint8_t servonum3 = 3;
uint8_t servonum4 = 4;
uint8_t servonum5 = 5;
uint8_t servonum6 = 6;
uint8_t servonum7 = 7;
uint8_t servonum8 = 8;
uint8_t servonum9 = 9;
uint8_t servonum10 = 10;

void setServoPos(int servo, int pos){
  //This first bit of code makes sure we are not trying to set the servo outside of limits
  int sendPos;
  if(pos > 179){
    pos = 179;
  }
  if(pos < 0){
    pos = 0;
  }
  sendPos = USMIN + ((USMAX - USMIN)/180 * pos);
  if(servo > -1 && servo < 16){//only try to move valid servo addresses
    pwm.writeMicroseconds(servo, sendPos);
  }
}
// przekaźniki
int prz1 = 28;
int prz2 = 29;
int prz3 = 26;
int prz4 = 27;
int prz5 = 24;
int prz6 = 25;
int prz7 = 22;
int prz8 = 23;
int prz9 = 31;
int prz10 = 30;
int prz_on = 33;


//czujniki napięcia

int in1 = 34;
int in2 = 35;
int in3 = 36;
int in4 = 37;
int in5 = 38;
int in6 = 39;
int in7 = 40;
int in8 = 41;
int in9 = 42;
int in10 = 43;

int inA1;
int inA2;
int inA3;
int inA4;
int inA5;
int inA6;
int inA7;
int inA8;
int inA9;
int inA10;


// the setup function runs once when you press reset or power the board
void setup() {
  // initialize digital pin LED_BUILTIN as an output.
  Serial.begin(9600);

  pinMode(in1, INPUT_PULLUP);
  pinMode(in2, INPUT_PULLUP);
  pinMode(in3, INPUT_PULLUP);
  pinMode(in4, INPUT_PULLUP);
  pinMode(in5, INPUT_PULLUP);
  pinMode(in6, INPUT_PULLUP);
  pinMode(in7, INPUT_PULLUP);
  pinMode(in8, INPUT_PULLUP);
  pinMode(in9, INPUT_PULLUP);
  pinMode(in10, INPUT_PULLUP);

  pinMode(prz1, OUTPUT);
  pinMode(prz2, OUTPUT);
  pinMode(prz3, OUTPUT);
  pinMode(prz4, OUTPUT);
  pinMode(prz5, OUTPUT);
  pinMode(prz6, OUTPUT);
  pinMode(prz7, OUTPUT);
  pinMode(prz8, OUTPUT);
  pinMode(prz9, OUTPUT);
  pinMode(prz10, OUTPUT);
  pinMode(prz_on, OUTPUT);
  digitalWrite(prz1, HIGH);
  digitalWrite(prz2, HIGH);
  digitalWrite(prz3, HIGH);
  digitalWrite(prz4, HIGH);
  digitalWrite(prz5, HIGH);
  digitalWrite(prz6, HIGH);
  digitalWrite(prz7, HIGH);
  digitalWrite(prz8, HIGH);
  digitalWrite(prz9, HIGH);
  digitalWrite(prz10, HIGH);



  pwm.begin();
  pwm.setOscillatorFrequency(27000000);
  pwm.setPWMFreq(SERVO_FREQ);  // Analog servos run at ~50 Hz updates
  delay(10);
}

// the loop function runs over and over again forever
void loop() {

  inA1 = digitalRead(in1);
  inA2 = digitalRead(in2);
  inA3 = digitalRead(in3);
  inA4 = digitalRead(in4);
  inA5 = digitalRead(in5);
  inA6 = digitalRead(in6);
  inA7 = digitalRead(in7);
  inA8 = digitalRead(in8);
  inA9 = digitalRead(in9);
  inA10 = digitalRead(in10);
 
  if (inA1 == LOW)
  {digitalWrite(prz_on, LOW);
  digitalWrite(prz1, LOW);
  setServoPos(servonum1,90);//0 Degrees
  }else{
  digitalWrite(prz_on, HIGH);
  digitalWrite(prz1, HIGH);
  setServoPos(servonum1,0);//90 degrees
  }
   if (inA2 == LOW)
  {digitalWrite(prz2, LOW);
  digitalWrite(prz_on, LOW);
  setServoPos(servonum2,90);//0 Degrees
  }else{
  digitalWrite(prz2, HIGH);
  digitalWrite(prz_on, HIGH);
  setServoPos(servonum2,0);//90 degrees
  }
     if (inA3 == LOW)
  {digitalWrite(prz3, LOW);
  digitalWrite(prz_on, LOW);
  setServoPos(servonum3,90);//0 Degrees
  }else{
  digitalWrite(prz3, HIGH);
  digitalWrite(prz_on, HIGH);
  setServoPos(servonum3,0);//90 degrees
  }
     if (inA4 == LOW)
  {digitalWrite(prz4, LOW);
  digitalWrite(prz_on, LOW);
  setServoPos(servonum4,90);//0 Degrees
  }else{
  digitalWrite(prz4, HIGH);
  setServoPos(servonum4,0);//90 degrees
  }
   if (inA5 == LOW)
  {digitalWrite(prz5, LOW);
  digitalWrite(prz_on, LOW);
  setServoPos(servonum5,90);//0 Degrees
  }else{
  digitalWrite(prz5, HIGH);
  digitalWrite(prz_on, HIGH);
  setServoPos(servonum5,0);//90 degrees
  }
     if (inA6 == LOW)
  {digitalWrite(prz6, LOW);
  digitalWrite(prz_on, LOW);
  setServoPos(servonum6,90);//0 Degrees
  }else{
  digitalWrite(prz6, HIGH);
  digitalWrite(prz_on, HIGH);
  setServoPos(servonum6,0);//90 degrees
  }
     if (inA7 == LOW)
  {digitalWrite(prz7, LOW);
  digitalWrite(prz_on, LOW);
  setServoPos(servonum7,90);//0 Degrees
  }else{
  digitalWrite(prz7, HIGH);
  digitalWrite(prz_on, HIGH);
  setServoPos(servonum7,0);//90 degrees
  }
   if (inA8 == LOW)
  {digitalWrite(prz8, LOW);
  digitalWrite(prz_on, LOW);
  setServoPos(servonum8,90);//0 Degrees
  }else{
  digitalWrite(prz8, HIGH);
  digitalWrite(prz_on, HIGH);
  setServoPos(servonum8,0);//90 degrees
  }
     if (inA9 == LOW)
  {digitalWrite(prz9, LOW);
  digitalWrite(prz_on, LOW);
  setServoPos(servonum9,90);//0 Degrees
  }else{
  digitalWrite(prz9, HIGH);
  digitalWrite(prz_on, HIGH);
  setServoPos(servonum9,0);//90 degrees
  }
     if (inA10 == LOW)
  {digitalWrite(prz10, LOW);
  digitalWrite(prz_on, LOW);
  setServoPos(servonum10,90);//0 Degrees
  }else{
  digitalWrite(prz10, HIGH);
  digitalWrite(prz_on, HIGH);
  setServoPos(servonum10,0);//90 degrees
  }

  // Print results to Serial Monitor to 2 decimal places
  Serial.print("Input Voltage1 = ");
  Serial.println(digitalRead(in1));
  /*
    Serial.print("Input Voltage2 = ");
  Serial.println(digitalRead(in2));
    Serial.print("Input Voltage3 = ");
  Serial.println(digitalRead(in3));
    Serial.print("Input Voltage4 = ");
  Serial.println(digitalRead(in4));
    Serial.print("Input Voltage5 = ");
  Serial.println(digitalRead(in5));
    Serial.print("Input Voltage6 = ");
  Serial.println(digitalRead(in6));
    Serial.print("Input Voltage7 = ");
  Serial.println(digitalRead(in7));
    Serial.print("Input Voltage8 = ");
  Serial.println(digitalRead(in8));
    Serial.print("Input Voltage9 = ");
  Serial.println(digitalRead(in9));
    Serial.print("Input Voltage10 = ");
  Serial.println(digitalRead(in10));
*/

  delay(100);
}
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości