• Welcome to LusoRobótica - Robótica em Português.
 

[Arduino]Dia 5 - Arduino analogWrite ( PWM )

Started by TigPT, 17 de July de 2008, 14:02

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

TigPT

Dia 5:

Então e se quisermos controlar dispositivos como os servos com o nosso Arduino?! este precisam dos conhecidos PWM, são ondas quadradas que variam entre GRD e VCC, e o que varia é o tempo de on e off do sinal.

Fica uma imagem explicativa do PWM, e da correspondência de valores para o analogWrite do Arduino:


Fonte da image: http://www.arduino.cc

Para fazermos o output de um PWM, dispomos dos pins 3, 5, 6, 9, 10 e 11, mas podemos recorrer à biblioteca Servo.h que se encontra no site http://www.arduino.cc, e assim controlar servos com PWM por qualquer dos pins do Arduino.

Como para o meu robô não preciso de usar mais de 6 servos neste momento, vou fazer um simples analogWrite(pinNumb, 0-255) como no código abaixo, para controlar o PWM.

Se ligarmos este sinal a uma simples ponte H para controlar motores DC, o que fazemos é activar e desactivar os transistors, produzindo assim com o máximo de torque uma velocidade mais baixa do que se utilizasse-mos um valor analógico entre GRD e VCC, para alem de que evita o aquecimento dos transistors, visto que estes estão sempre ou ao corte, ou saturado.

No vídeo abaixo faço um exemplo disso mesmo, que pode ser facilmente acompanhado pelo código em anexo.

Coloquei um bocado de fita branca na roda para se poder ver as diferenças de velocidade.
http://www.revver.com/video/900986

Gerar PWM com Arduino

joaoamaral

Twitter: @joaoamaral | Skype: joaoamaral

TigPT

Excelente vídeo, obrigado por partilhares ;)

metRo_


TigPT



amando96

Quote from: TigPT on 06 de May de 2009, 10:41
Excelente vídeo, obrigado por partilhares ;)

a roda is ponte-H é de ''o meu robot'' né?

TigPT

sim.. :) não chegou a funcionar por causa de umas falhas... :)

Raul

#8
Mas eu vi que se pode controlar um servo digitalmente, com o digitalWrite(pin, value)
Esta aqui o circuito e tudo, estranhei a necessidade da resistência.

servo output


Hobby servos are a type of self-contained motor that can move in a 180º arc. All that is needed is a pulse sent every 20ms. This example uses a servoPulse function to move the servo from 10º -170º and back again.
int servoPin = 2; // servo connected to digital pin 2
int myAngle; // angle of the servo roughly 0-180
int pulseWidth; // servoPulse function variable
void setup()
{
pinMode(servoPin, OUTPUT); // sets pin 2 as output
}
void servoPulse(int servoPin, int myAngle)
{
pulseWidth = (myAngle * 10) + 600; // determines delay
digitalWrite(servoPin, HIGH); // set servo high
delayMicroseconds(pulseWidth); // microsecond pause
digitalWrite(servoPin, LOW); // set servo low
}
void loop()
{
// servo starts at 10 deg and rotates to 170 deg
for (myAngle=10; myAngle<=170; myAngle++)
{
servoPulse(servoPin, myAngle); // send pin and angle
delay(20); // refresh cycle
}
// servo starts at 170 deg and rotates to 10 deg
for (myAngle=170; myAngle>=10; myAngle--)
{
servoPulse(servoPin, myAngle); // send pin and angle
delay(20); // refresh cycle
}
}

TigPT

No fundo esse código está a gerar um pwm por software.

Njay

É assim que funciona a biblioteca MegaServo do ambiente de programação do Arduino.

Raul

Mas é necessário ter aquela resistência de 220 ohms?
Ou os 220ohms o arduino já os aplica dentro dele?
Cumprimentos

Njay

A resistência de 220 Ohm é uma segurança extra. Não é necessário, mas se quiseres um sistema tolerante a algumas falhas, podes pôr.

leandrosilva


Mikey

TigPT o ficheiro do codigo do motor1 esta corrupto quando se extrae .
alguem disponibiliza ?