Van Servo naar relay

Arduino specifieke Software
Berichten: 38
Geregistreerd: 05 Okt 2013, 17:23

Van Servo naar relay

Berichtdoor GeertV » 05 Okt 2013, 17:47

Hallo ,

Wie kan me helpen om het servo gedeelte te vervangen voor 4 relay uitgangen.
Ik wil dit gaan gebruiken om een Zon volg systeem op te zetten ( Met Zonnepanelen )
Alvast Bedankt
Geert

// Must include for servos to work
#include <Servo.h>
// Elements is the amount of numbers you want to dedicate to the running average
// Increase the number for a slower reaction
#define elements 5

// Variables for loops
int i = 0;
int j = 0;

// The Analog Pins - C:Centre R:Right L:Left U:Up D:Down
int pinC = 0;
int pinR = 1;
int pinL = 2;
int pinU = 3;
int pinD = 4;

// Variables to store the data from the photo-resisitors
int analogValueC;
int analogValueL;
int analogValueR;
int analogValueU;
int analogValueD;

// The change in position from the last reading
float posX = 0;
float posY = 0;

// The running average readings
// - Each element is made up of the difference between opposite photorestors
int x[elements], y[elements];

// Servos - X is rotation/spin, Y is the tilt servo
Servo servoX;
Servo servoY;

// Common servo setup values
int minPulse = 600; // minimum servo position, us (microseconds)
int maxPulse = 2400; // maximum servo position, us

void setup() {

// Turn on the pins, program doesn't work without it *shrug*
pinMode(10, OUTPUT);
pinMode(11, OUTPUT);
digitalWrite(10, HIGH);
digitalWrite(11, HIGH);
delay(200);

// Attach each Servo object to a digital pwm pin
servoY.attach(10, minPulse, maxPulse);
servoX.attach(11, minPulse, maxPulse);
delay(200);

// Sanity check!
servoX.write(90);
servoY.write(90);

// Start all the running average values to zero
for(i=0;i<elements;i++){
x[i] = 0;
y[i] = 0;
}

// Serial - good for troubleshooting
Serial.begin(9600);
delay(200);
}

void loop() {

// This will help to balance the values so the sun tracker doesn't Jump around
// during high contrast situations
int normal = (analogRead(pinC)/50);

// Read the photorestors
analogValueC = (analogRead(pinC)/normal);
analogValueL = (analogRead(pinL)/normal);
analogValueR = (analogRead(pinR)/normal);
analogValueU = (analogRead(pinU)/normal);
analogValueD = (analogRead(pinD)/normal);

// Check if the Centre photorestor is the brightest, if it is then set the change to zero
if((analogValueC <= analogValueL)||(analogValueC <= analogValueR)){
// Value is positive: go right, negative: go left
x[i] = analogValueR - analogValueL;
} else {
x[i] = 0;
}
if((analogValueC <= analogValueU)||(analogValueC <= analogValueD)){
y[i] = analogValueU - analogValueD;
} else {
y[i] = 0;
}

// The change in position is the average of all the elements
int totalX = 0;
int totalY = 0;
for(j=0;j<elements;j++){
totalX+=x[j];
totalY+=y[j];
}
posX = totalX/elements;
posY = totalY/elements;

// Send the values through the serial when it has gone through all the elements
if(i==0)avgDisplay();
//if(i==0)rtDisplay();

// Change the position of the tracker towards the light
simpleChangePos();

// Increment I through 0 to number of elements
i++;
i = i%elements;
delay(301);
}


// Class will display a cross on the serial monitor showing real time values of the resistors
void rtDisplay(){
Serial.print(" ");
Serial.println(analogValueU);
Serial.println(" /\\");
Serial.print(analogValueL);
Serial.print(" <= ");
Serial.print(analogValueC);
Serial.print(" => ");
Serial.println(analogValueR);
Serial.println(" \\/");
Serial.print(" ");
Serial.println(analogValueD);
Serial.println();
Serial.println();
}

// Class will display the change in position
void avgDisplay(){
Serial.print(" ");
if(posY>0){
Serial.println(posY);
Serial.println(servoY.read());
} else {
Serial.println(" ");
}
Serial.println(" /\\");
if(posX>0){
Serial.print(posX);
Serial.println(servoX.read());
} else {
Serial.print(" ");
}
Serial.print(" <= ");
if((posX==0)&&(posY==0)){
Serial.print("C");
} else {
Serial.print(" - ");
}
Serial.print(" => ");
if(posX<0){
Serial.println(-posX);
Serial.println(servoX.read());
} else {
Serial.println(" ");
}
Serial.println(" \\/");
Serial.print(" ");
if(posY<0){
Serial.println(-posY);
Serial.println(servoY.read());
} else {
Serial.println(" ");
}
Serial.println();
Serial.println();
}

// Named so, because I am planning on making a more complicated verson
void simpleChangePos(){
// Variables to store the current position of the servos
int readX = servoX.read();
int readY = servoY.read();

// If there is a change:
if(posX!=0){
// If the servo is going to change position past its range of motion
if((readX+posX)>180){
if(readX!=180){
servoX.write(180);
}
} else if((readX+posX)<0){
if(readX!=0){
servoX.write(0);
}
} else {
// If the change is a non-zero and not past the servo's limit, change the position
servoX.write((readX+posX));

}
delay(15);
}

if(posY!=0){
if((readY+posY)>180){
if(readY!=180){
servoY.write(180);
}
} else if((readY+posY)<0){
if(readY!=0){
servoY.write(0);
}
} else {
servoY.write((readY+posY));
}
delay(15);
}

}

Advertisement

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: Van Servo naar relay

Berichtdoor nicoverduin » 05 Okt 2013, 23:35

Geert een servo draait nav de ingegeven hoek (PWM signaal) naar de servo. Hoe zie je dat dan om er een relais van te maken?
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 38
Geregistreerd: 05 Okt 2013, 17:23

Re: Van Servo naar relay

Berichtdoor GeertV » 06 Okt 2013, 21:27

Hallo Nico ,

Ja dat weet ik ook niet , maar ik dacht om na het vergelijken ( van de ldr(s) ) een relay te kunnen aansturen .
Zie mijn schema ( ben nog bezig om een manier te vinden om de 2 ldr(s) ( Horizontaal ) en de 2 vertikaal met elkaar te vergelijken ) en daar de betreffende relai te besturen.

*/
// to the pins used:
int analogInPin0 = A0;
int analogInPin1 = A1;
int analogInPin2 = A2;
int analogInPin3 = A3;
//int digitalOutPin = 13;

int sensorValue0 = 0;
int sensorValue1 = 0;
int sensorValue2 = 0;
int sensorValue3 = 0;
//int outputValue = 0;
int RelayL = 8 ;
int led = 13 ;


void setup() {
// initialize serial communications at 9600 bps:
Serial.begin(9600);
pinMode(RelayL, OUTPUT);
pinMode(led, OUTPUT);
}

void loop() {
// read the analog in value:
//digitalWrite(led, HIGH);

sensorValue0 = analogRead(analogInPin0);
sensorValue1 = analogRead(analogInPin1);
sensorValue2 = analogRead(analogInPin2);
sensorValue3 = analogRead(analogInPin3);

if (sensorValue0 > sensorValue1){ // hier zou dus de vergelijking moeten komen voor alle ldr(s)
digitalWrite(RelayL,HIGH);
digitalWrite(led, HIGH);
}
else {
digitalWrite(RelayL,LOW);
digitalWrite(led, LOW);
}


// print the results to the serial monitor:
Serial.print("sensor Left = " );
Serial.print(sensorValue0);
Serial.print(" sensor Right = " );
Serial.print(sensorValue1);
Serial.print(" sensor Up = " );
Serial.print(sensorValue2);
Serial.print(" sensor Down = " );
Serial.print(sensorValue3);
Serial.print(" Motor draait naar = ");
Serial.println(RelayL);
// after the last reading:
delay(1000);
//digitalWrite(led, LOW);
//delay(1500);
}

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: Van Servo naar relay

Berichtdoor nicoverduin » 07 Okt 2013, 07:40

zal aan mij liggen, maar ik zie geen schema???
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 108
Geregistreerd: 07 Aug 2013, 21:34

Re: Van Servo naar relay

Berichtdoor KrisG » 07 Okt 2013, 07:55

De vraag is inderdaad wat je wil bereiken.
Wil je uiteindelijk met die relais motoren gaan sturen om de positie van je panelen te wijzigen of iets anders ?

Kris
Als je het probleem gedetailleerd genoeg omschrijft, heb je meestal al de oplossing.

Berichten: 38
Geregistreerd: 05 Okt 2013, 17:23

Re: Van Servo naar relay

Berichtdoor GeertV » 07 Okt 2013, 22:52

Hallo KrisG ,

Ja , dat is wat ik wil. 4 relais die 2 motoren aansturen..
Links-Rechts en Hoog-laag..

@Nico ,
Ik had een voorbeeld van het programma erbij gedaan ... en geen schema.
Sorry

Groetjes Geert

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: Van Servo naar relay

Berichtdoor nicoverduin » 08 Okt 2013, 06:46

Geert dan moet je wel kunnen beschrijven wat er gebeurt als LDR1 > LDR2 bijv. Relais 1 AAN, Relais 2 UIT etc.
M.a.w. Als jij niet kan beschrijven wat je wilt, kun je het ook niet programmeren.
Beetje de aannemer vragen : "Ik wil een huis". Dan weet hij ook niet wat je verwacht. Kan hij wel een huis bouwen maar geen idee of dat is wat jij in gedachte had.
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 108
Geregistreerd: 07 Aug 2013, 21:34

Re: Van Servo naar relay

Berichtdoor KrisG » 08 Okt 2013, 07:49

Als het om motoren gaat zou ik, als ik zo'n ding wou maken, eens kijken naar een H-brug module.

Aansturen met 2 outputlijnen, zijn ze gelijk dan staat de motor stil, zijn ze verschillend dan draait de motor de ene of de andere kant op, afhankelijk van welke hoger is.

snelheid kan je ook nog regelen via pwm.

Als je dan je LDR's gaat vergelijken, kom je al snel tot een eenvoudige aansturing.

Kris
Als je het probleem gedetailleerd genoeg omschrijft, heb je meestal al de oplossing.

Berichten: 38
Geregistreerd: 05 Okt 2013, 17:23

Re: Van Servo naar relay

Berichtdoor GeertV » 08 Okt 2013, 22:34

Hallo KrisG ,

Ja dat is wat ik ga doen , ga eens zoeken wat ik daar al voor nodig heb..
Als je nog een mooi voorbeeld hebt van wat je beschreef zou mooi zijn....( Aansturen met 2 outputlijnen )

( Ik krijg 36 Volt-2,5 A motoren ) .

Geert

Berichten: 108
Geregistreerd: 07 Aug 2013, 21:34

Re: Van Servo naar relay

Berichtdoor KrisG » 08 Okt 2013, 23:18

Een veelvoorkomende H-brug met uitleg:

http://www.geekonfire.com/wiki/index.php?title=Dual_H-Bridge_Motor_Driver

Maximaal 2A

Kris
Als je het probleem gedetailleerd genoeg omschrijft, heb je meestal al de oplossing.

Terug naar Arduino software

Wie is er online?

Gebruikers in dit forum: ajawupovi, otixohxuqiha en 57 gasten