22-04-2025, 13:16
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?
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);
}