LusoRobótica - Robótica em Português
Sistemas específicos => Arduino / AVR => Tópico iniciado por: AcidDagger em 01 de Junho de 2010, 23:07
-
boas pessoal eu fiz este codigo para um mini projecto que estou a desenvolver...
const int servo = 11;
const int sensor = 5;
const int x = 100;
int angulo;
int valor;
void setup () {
pinMode(servo, OUTPUT);
pinMode(sensor, INPUT);
Serial.begin(9600);
}
void movimento(int servo, int angulo) {
valor = (angulo * 10) + 600;
digitalWrite(servo, HIGH);
delayMicroseconds(valor);
digitalWrite(servo, LOW);
}
void loop () {
int analogValue = analogRead(sensor);
if (analogValue > x) {
for (angulo=10; angulo<=170; angulo++)
{
movimento(servo, angulo);
delay(5);
}
for (angulo=170; angulo>=10; angulo--)
{
movimento(servo, angulo);
}
}
else {
digitalWrite(servo, LOW);
}
Serial.println(analogValue, DEC);
}
Resumidamente no código está
Se o sensor detectar algo aciona o servo dos 10 aos 170º e volta dos 170º ao 10º e depois espera outra leitura do sensor
O que é gostava de saber é como posso fazer com que o servo so possa ser acionado uma vês, mesmo que o sensor detecte alguma coisa. basicamente o que eu quero é para o loop ate voltar a clicar num botao... :)
Quem poder ajudar ficaria agradecido ;D
-
Não sei se é isto que queres, e a minha programação não é das melhores mas acho que assim funciona
void loop () {
int analogValue = analogRead(sensor);
if (analogValue > x && input(PIN_x)=1{ \\assim só entra se o valor do sensor for maior que x e se pressionares o botão
for (angulo=10; angulo<=170; angulo++) {
movimento(servo, angulo);
delay(5); } for (angulo=170; angulo>=10; angulo--) {
movimento(servo, angulo);
}
}
else {
digitalWrite(servo, LOW);
}
Serial.println(analogValue, DEC);
}
Espero ter dado alguma ajuda
-
E a função input() está declarada onde? E estás a fazer uma atribuição dentro do if(), o que não faz sentido...
ATENÇÂO: Corrigi apenas erros de sintaxe, não faço ideia se isto vai funcionar ou nao...
void loop () {
int analogValue = analogRead(sensor);
if (analogValue > x && digitalRead(PIN_x) == HIGH){ // Assumindo que quando pressionas o botao, ele faz o PIN_x ir a HIGH
for (angulo=10; angulo<=170; angulo++) {
movimento(servo, angulo);
delay(5); } for (angulo=170; angulo>=10; angulo--) {
movimento(servo, angulo);
}
} else {
digitalWrite(servo, LOW);
}
Serial.println(analogValue, DEC);
}
Agora, para aquilo que queres... Basta teres uma variável que define se queres fazer o varrimento do Servo ou não...
Vê lá se consegues perceber pelo código...
const int servo = 11;
const int sensor = 5;
const int butPin = 10;
const int x = 100;
int angulo;
int valor;
boolean enableServo = true;
void setup () {
pinMode(servo, OUTPUT);
pinMode(sensor, INPUT);
pinMode(butPin, INPUT);
Serial.begin(9600);
}
void movimento(int servo, int angulo) {
valor = (angulo * 10) + 600;
digitalWrite(servo, HIGH);
delayMicroseconds(valor);
digitalWrite(servo, LOW);
}
void loop () {
if(enableServo){ // Se o servo tiver luz verde para rodar...
// ... vamos ler o sensor e etc...
int analogValue = analogRead(sensor);
if (analogValue > x) {
for (angulo=10; angulo<=170; angulo++)
{
movimento(servo, angulo);
delay(5);
}
for (angulo=170; angulo>=10; angulo--)
{
movimento(servo, angulo);
}
} else {
digitalWrite(servo, LOW);
}
Serial.println(analogValue, DEC);
// IMPORTANTE > Passar esta variável a falso
// Assim, no próximo ciclo, já não vai ler o sensor
enableServo = false;
}else{
// Se o servo tiver luz vermelha, vai observar um botão
if(digitalRead(butPin) == HIGH) enableServo = true;
}
}
-
Faltam uns ( )
if (analogValue > x && (digitalRead(PIN_x) == HIGH)){ // Assumindo que quando pressionas o botao, ele faz o PIN_x ir a HIGH
-
Faltam uns ( )
if (analogValue > x && (digitalRead(PIN_x) == HIGH)){ // Assumindo que quando pressionas o botao, ele faz o PIN_x ir a HIGH
Desculpa lá, mas não faltam...
if (analogValue > x && digitalRead(PIN_x) == HIGH){ // Assumindo que quando pressionas o botao, ele faz o PIN_x ir a HIGH
Isto tem tudo para funcionar... Podes pôr os (), mas não são necessários.
-
Cuidados com as predecências das funções, que podem dar chatices..
if ((analogValue > x) && (digitalRead(PIN_x) == HIGH)){ // Assumindo que quando pressionas o botao, ele faz o PIN_x ir a HIGH
Eu faria assim para não existirem duvidas nem problemas.
-
Tenho a ideia que as prioridades são iguais às do Processing, por ordem decrescente:
// Multiplicative: * / %
// Additive: + -
// Relational: < > <= >=
// Equality: == !=
// Logical AND: &&
// Logical OR: ||
// Assignment: = += -= *= /= %=
Logo, nao precisas dos parênteses, mas se ficam mais seguros com eles, tudo bem...
-
É uma questão de hábito e se não fazem nada o gcc trata de os mandar para o lixo não é por eles que o programa cresce.
-
Pois realmente tens razão :-[ Peço desculpa :-\
-
Obrigado a todos...
Microbyte, era mesmo isso, não me tava a lembrar dos boolean... ;)