Social Icons

Mostrando postagens com marcador Servo. Mostrar todas as postagens
Mostrando postagens com marcador Servo. Mostrar todas as postagens

Jeremy Blum Projects - Arduino Parte [5]

Essa é a semana 5...


Para quem não viu os outros ai vai o link:
Semana [1]
Semana [2]
Semana [3]
Semana [4]











Cada Imagem com Seus respectivos códigos abaixo. Click para dar Zoom.



//Program by Jeremy Blum                                                                                 
//www.jeremyblum.com                                                                                     
//Test Motor Speed Using a                                                                               Transistor                                                                                                         
//Define Pins                                                                     
int motorPin = 9;                                                                     
void setup()
{
  //Set the PWM Motor pin as an output
  pinMode(motorPin, OUTPUT);
}
void loop()
{
  //Increase Motor Speed from 0 -> 255
  for (int i=0; i<=255; i++)
  {
    analogWrite(motorPin, i);
    delay(10);
  }
  delay(500); //Hold it
  //Decrease Motor Speed from 255 -> 0
  for(int i=255; i>=0; i--)
  {
    analogWrite(motorPin, i);
    delay(10);
  }
  delay(500); //Hold it!
}


//Program by Jeremy Blum
//www.jeremyblum.com
//Controls a Servo Motor
//Include Servo Library
#include <Servo.h>
//Define Pins
int servoPin = 9;
//Create Servo Object
Servo jeremysServo;
void setup()
{
  //Attaches the Servo to our object
  jeremysServo.attach(servoPin);
}
void loop()
{
  //We can Turn a Servo to 180 degrees
  for (int i = 0; i <=180; i=i+20)
  {
    jeremysServo.write(i);
    delay(1000);
  }
 
}

---------------------------------------------------

//Program by Jeremy Blum
//www.jeremyblum.com
//Controls a Servo Motor using the info from an IR Distance Sensor
//Include Servo Library
#include <Servo.h>
//Define Pins
int servoPin = 9;
int distPin = 0;
//Create Servo Object
Servo jeremysServo;
void setup()
{
  //Attaches the Servo to our object
  jeremysServo.attach(servoPin);
}
void loop()
{
  //Read the Distance Sensor and adjust values
  int dist = analogRead(distPin);
  int pos = map(dist, 0, 1023, 0, 180);

  //Turn the servo
  jeremysServo.write(pos);
 
}

6.2.1) Arduino + Mouse PS2 + Servo Simples [Parte 2 e 3]


Parte 2 e 3 do meu projeto com arduino e um mouse ps2.
Na primeira tentativa, testei com o mouse sem ter uma interface com o computador, direto com o arduino.
Então comecei a pesquisar no site oficial do Arduino, por uma interface entre o mouse, o computador e o arduino. Descobri uma maneira de interligar tudo isso, a partir de um tal de Processing.
Processing, não sei dizer ao certo sua denominação, porém ele pode fazer a comunicação do computador com uma placa arduino, pois ele consegue acessar e usar a porta paralela do pc para mandar informações e para receber, testei e logo posto aqui um potenciômetro que regula uma cor na tela do PC que seria o de mandar informações do arduino pro PC. Do mesmo jeito que o SerialMonitor do sketch do arduino faz, mas com uma sofisticação maior.
Inicialização muito parecida com a do arduino.
Para fazer esta comunicação (interface), você deve fazer o download da biblioteca processing em, biblioteca processing.
Ele roda tanto no Linux quanto no Windows e MacOS, usei ja no Windows e no Ubuntu funcionou perfeito.
Depois de ter feito o download, siga os seguintes passos:
  • Descompacte a biblioteca e copie a pasta “arduino” dentro da sub-pasta “bibliotecas” do seu sketchbook do seu processing. (Você pode achar o diretório de seu sketchbook abrindo as preferências do processing. Se você não tiver uma sub-pasta “biblioteca” em seu sketchbook, crie uma!)
  • Rode o arduino, abra Exemplos > StandardFirmata sketch, e faça o upload para a placa.
  • Configure o processing com o serial em: http://processing.org/reference/libraries/serial/
  • Dentro do processing, abra um dos exemplos que vem junto da biblioteca arduino.
  • Edite o exemplo para acertar a porta serial.
  • Rode o exemplo.
Pronto esta configurado!

Como já sabemos um pouco sobre cada módulo e o necessário para iniciarmos nossa experiência com estes componentes, vamos ao que interessa!

Primeiramente devemos escrever o código no Arduino (está comentado linha a linha):
 

#include<servo.h> //inicializa biblioteca servo

Servo servo1; Servo servo2; cria o objeto servo 1 e 2

void setup() {
pinMode(1,OUTPUT);
servo1.attach(14); //pino analógico 0
servo2.attach(15); //pino analógico 1
Serial.begin(19200); //inicia comunicação serial
Serial.println("Preparado"); //imprime na tela do computador
}
void loop() { // o void loop ainda está um pouco
// complicado para eu poder explicar.
static int v = 0;
if ( Serial.available()) {
char ch = Serial.read();
switch(ch) {
case '0'...'9':
v = v * 10 + ch - '0';
break;
case 's':
servo1.write(v);
v = 0;
break;
case 'w':
servo2.write(v);
v = 0;
break;
case 'd':
servo2.detach();
break;
case 'a':
servo2.attach(15);
break;
}
}
}

Assim sendo, grave o sketch no arduino e partiremos para a próxima etapa, o processing.

Depois de instalado o processing (post anterior) e já ter feito o upload do sketch para o arduino, compile este programa dentro do processing:

import processing.serial.*;
int gx = 15; //declaração das variáveis de processo
int gy = 35;
int spos=90; //esta é a variável que controla o servo 1 ou 2
//repare que ela já recebe o num. 90, o que indica
//que o servo irá inicializar em 90°!
float leftColor = 0.0;
float rightColor = 0.0;
Serial port;
void setup()
{
size(720, 720);
colorMode(RGB, 1.0);
noStroke();
rectMode(CENTER);
frameRate(100);
println(Serial.list()); // List COM-ports
port = new Serial(this, Serial.list()[2], 115200);
//esta linha é muito importante para a comunicação serial
//em Serail.list()[2] troque o 2 pelo número do indice da porta "COM"
//que esta se comunicando com o arduino. Em 115200 é a velocidade
//que ela se comunica, você também deve trocar este valor se diferir da
//velocidade da sua.
}
void draw()
{
background(0.0);
update(mouseX);
update(mouseY);
fill(mouseX/4);
fill(mouseY/4);
rect(150, 320, gx*2, gx*2);
fill(180 - (mouseX/4));
rect(450, 320, gy*2, gy*2);
fill(180 - (mouseY/4));
}
void update(int x)
{
//Calculata a posição do servo por mouseX e mouseY
spos= x/4; spos=y/4;
//Atualiza saída do servo 1 ( de 0 a 180)
port.write("s"+spos);
//Atualiza saída do servo 2 ( de 0 a 180)
port.write("w"+spos);
// Just some graphics
leftColor = -0.002 * x/2 + 0.06;
rightColor = 0.002 * x/2 + 0.06;
gx = x/2;
gy = 100-y/2;
}



6.2) Arduino + Mouse PS2 + Servo Simples [Parte 1]

A primeira parte do projeto para vocês entenderem, o que eu demorei muito tempo, é a comunicação que o mouse faz com (no caso) o computador.
  • O periférico mouse, utiliza do protocolo PS2 para comunicação. O que significa que é uma comunicação bidirecional, com uma frequência na casa de KHz. E é muito simples! Possui 4 fios para conexão: GND, VCC, DATA e CLOCK.
  • Possui 2 acumuladores absolutos, um para o eixo X e o outro para o eixo Y. O que eles tem que fazer? Conforme movimentamos o mouse, para direita e esquerda, cima e baixo, vai se acumulando valores nestes acumuladores (que na mais são que variáveis contadoras) e assim o computador processa o valor do acumulador, setando o mouse na tela (posição).

Sendo assim, esses acumuladores possuem um range de valores de -255 à 255, e será esta informação que usaremos para controlar o servo. Imaginem só, x: -255 que seria a menor posição do acumulador x na tela do PC! E aonde ele se encontra? No último pixel a direita ou a esquerda do vídeo (depende do processamento da informação). O mesmo vale para o acumulador Y, porém ele estará acumulado (setado) no alto ou abaixo do vídeo.

Pense agora em um servo! ele pode estar em 0° ou 180°, dependendo do sinal injetado. Agora relacionamos esses dados, com os do mouse: 0° = x = -255 , 90° = x = 0 , 180° = x = 255 e assim por diante. Conseguimos então, de acordo com a posição do mouse estabelecer o angulo em que o servo deve se encontrar!

Bacana não!? Tem mais!

O mouse convencional ainda possui 3 botões: direita, esquerda e scroll! Os quais podem também ser utilizados na programação!!

Pinagem PS2:


1 - Dados
2 - Não conectado

3 - GND

4 - Vcc (+5V)
5 - Clock
6 - Não Conectado

disponível em arduino.cc

Circuito:

  • Conecte o pino Dados (data) no pino digital 5.
  • Conecte o pino Ground em qualquer GND do arduino.
  • Conecte o pino Clock no pino digital 6.
  • Conecte o pino Vcc (5V) no pino +5V na placa do arduino.

A biblioteca PS2, que serve para "interfacear" mouse e teclado conforme protocolo ps2, esta disponivel em biblioteca.ps2, no site arduino.cc.

Bom, antes de usarmos o arduino como host do mouse, e assim controlar o servo, iremos fazer o processamento do sinal do mouse para o arduino via serial (USB) e pelo computador. Utilizaremos o processing, para isto!

Mas agora essa parte fica para outro dia, pois já é fim de ano, e os exames na faculdade estão chegando! Ficar de DP, jamais!

Deixo aqui um vídeo para vocês compreenderem o projeto:





6.1) Servo Seguindo a LUZ





Esta é uma forma simples de você fazer um servo motor seguir a luz, usando alguns simples componentes!
O vídeo original é feito com um ArduinoMEGA, o qual tem mais I/O (entradas e saídas). Todavia pode ser construído com qualquer base “Arduinana”.

Componentes:
1 x Servo motor (Parabólica serve também)
2 x Fotoresistores
2 x Resistor 470ohms
LightTracker

Faça as ligações como descrito no esquema do FRITIZING acima.

Lembre-se que a gambiarra aqui é colocar de alguma forma uma pequena protoboard em cima do servo! Ou fica a vontade para usar a imaginação! (veja vídeo topo pagina)
SKETCH:
#include <Servo.h>
Servo myservo;
int pos = 0;  // Variavel para guardar posicao servo.
int inputPhotoLeft = 1; // Facil de ler, instante 1 ou 0.
int inputPhotoRight = 0;

int Left = 0; // Guarda valor fotoresistor.
int Right = 0; // Guarda valor fotoresistor.

void setup()
{
myservo.attach(9); // Conecta servo ao pino digital 9.
}

void loop()
{
// Le os valores dos fotoresistores e guarda nas variaveis 
Left = analogRead(inputPhotoLeft);
Right = analogRead(inputPhotoRight);

// Checa se a esquerda é maior que direita, se sim move p/ direita.
if (Left > (Right +20))
// +20 é uma zona morta, sem isso causa interferencia.
{
if (pos < 179)
pos++;
myservo.write(pos);
}

// Checa se a esquerda é menor que a direita, se sim move esquerda.
if (Right > (Left +20))
// +20 é uma zona morta, sem isso causa interferencia.
{
if (pos > 1)
pos -= 1;
myservo.write(pos);
}

// Adicionando delay ou não o servo corre mais devagar
delay(10);
}
Qualquer dúvida por favor comente, seu feedback é muito importante!
Créditos, http://stigern.net/blog/?cat=35