Resultados da busca - %E5%8D%8E%E5%AE%87%E5%BD%A9%E7%A5%A8%E6%9C%89%E6%89%98%E5%90%97%E3%80%90%E2%94%8B%E7%A8%B3%E5%AE%9A2%E2%92%8F7%E2%92%8F01705%E2%94%8B%E6%89%A3%E3%80%93%E3%80%91
um mouse, e não é detectável em jogos online nem muda os drivers, com um simples Arduíno mini é possível reproduzir o projeto em um mouse comum.
Componentes necessários(para teste):
1x Arduino uno ou mini...
1x protoboard
x Jumpers
5x transistores PNP BC558 //para fazer o teste correto quando inseri-lo ao mouse
5x resistores de 1k //para base dos transistores
5x resistores de 220r //para os leds
5x Leds //para testar os terminais que vão para a placa do mouse
6 Push-Button //para acionaras funçoes
Componentes necessários(para uso no dispositivo):
1x Arduino mini
1x mouse comum
5x transistores PNP BC558 //para ativar o sinal do mouse conforme o Arduíno ordenar
5x resistores de 1k //para base dos transistores
Bom como perceberam,apesar de eu não ter tirado muitas fotos (pretendo corrigir isso ao final do projeto) o esquema de ligaçao é simples, pois o circuito foi adaptado para funcionar como push-buttons visto que o mouse para comandar suas funções utiliza o GND para acionamento dos botoes então é ae que entra o BC558, sabendo que o Arduíno só tem saída + em suas portas era necessário um transistor PNP para converter o sinal em GND.
Assim ligamos as saídas do Arduíno nos resistores de 1k que por sua vez são ligados a base do transistor, tendo seus coletores ligados ao GND os pinos Emissores serão ligados as trilhas do circuito que receberia o sinal dos botoes, o Arduíno mini sera alimentado pela própria usb do dispositivo e as trilhas originais dos botoes devem ser cortadas./*para mais proteção recomenda-se o uso de um regulador de tensão 5v , o mini pode ser programado com um Arduíno uno ou placa usb-serial*/
Uma das vantagens é que o código é simples e de fácil entendimento para criação de novos perfis de macro, então crie seu próprio macro!
vamos ao sketch:
//projeto Macro mouse genericoint botDIR=13;//entrada botao direito int botdir=12;//saida transistor PNP BC558 direitaint botESQ=11;//entrdada botao esquerdo int botesq=10;//saida transistor PNP BC558 esquerdaint botCTR=9;//entrada botao central(roda do mouse) int botctr=8;//saida botao transistor PNP BC558 central(roda do mouse)int bot1LTR=7;//entrada 1 botao lateral int botltr1=6;//saida de transistor PNP BC558 botao lateralint bot2LTR=5;//entrada 2 botao lateral int botltr2=4;//saida botao transistor PNP BC558 lateralint botMODE=3;//entrada botao Mode gamming (CPI) int mode=0;//variavel inicial do menu//tempo de precionamento#define t_500 delay(500);#define t_300 delay(300);#define t_200 delay(200);#define t_100 delay(100);//ativa e desativa os botoes//valores de ligado e desligado foram invertidos por causa do transistor#define ligEsq digitalWrite(botesq, LOW); ;//liga o esquerdo #define desEsq digitalWrite(botesq, HIGH);//desliga----^#define ligDir digitalWrite(botdir, LOW); ;//liga o direito #define desDir digitalWrite(botdir, HIGH); //desliga--^#define ligLtr1 digitalWrite(botltr1, LOW); ;//liga o lateral 1 #define desLtr1 digitalWrite(botltr1, HIGH);//desliga---^#define ligLtr2 digitalWrite(botltr2, LOW); ;//liga o lateral 2 #define desLtr2 digitalWrite(botltr2, HIGH);//desliga--^#define ligCtr digitalWrite(botctr, LOW); ;//liga o central #define desCtr digitalWrite(botctr, HIGH);//desliga--^//Principais Skills do Macro-------------------------------------------------------------------------------------------------------------------------------------------------------------#define Pressed_Dir int botDIR1 =digitalRead(botDIR); if(botDIR1 == LOW){ligDir;}else{desDir;}//precionamento direito normal #define Pressed_Esq int botESQ1 =digitalRead(botESQ); if(botESQ1 == LOW){ligEsq;}else{desEsq;}//precionamento esquerdo normal#define Pressed_1Ltr int botLTR1 =digitalRead(bot1LTR); if(botLTR1 == LOW){ligLtr1;}else{desLtr1;}//precionamento lateral 1 normal#define Pressed_2Ltr int botLTR2 =digitalRead(bot2LTR); if(botLTR2 == LOW){ligLtr2;}else{desLtr2;}//precionamento lateral 2 normal#define Pressed_Ctr int botCTR1 =digitalRead(botCTR); if(botCTR1 == LOW){ligCtr;}else{desCtr;}//precionamento roda do mouse normal#define Pressed_Esq_3kill int botESQ1 =digitalRead(botESQ); if(botESQ1 == LOW){for(int ct=0; ct < 3; ct++){ligEsq; t_200; desEsq; t_100;}}else{desEsq;}//triplo precionamento direito#define Pressed_Ctr_3 int botCTR1 =digitalRead(botCTR); if(botCTR1 == LOW){for(int ct=0; ct < 3; ct++){ligCtr; t_200; desCtr; t_100;}}else{desCtr;}//triplo precionamento roda do mouse#define Pressed_Esq_Scope int botESQ1 =digitalRead(botESQ); if(botESQ1 == LOW){ligDir; t_300; ligEsq; t_300; desEsq; desDir;}//scope "direita">>"esuqerda"|"direita"#define Pressed_Mode int botMODE1 =digitalRead(botMODE); if(botMODE1 == LOW){mode++; t_500;}if(mode == 5){mode=0;}//seleciona o n max de perfis que atualmente é 6//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^void setup(){//PULLUP PERMITE LIGAR UM BOTAO AO TERRA DIRETAMENTE//Serial.begin(9600); pinMode(botDIR,INPUT_PULLUP);//Entrada direita pinMode(botdir,OUTPUT);//saida direita pinMode(botESQ,INPUT_PULLUP);//Entrada esquerda pinMode(botesq,OUTPUT);//saida esquerda pinMode(botCTR,INPUT_PULLUP); //Entrada do botao da roda do mouse pinMode(botctr,OUTPUT);//saida do botao da roda do mouse pinMode(bot1LTR,INPUT_PULLUP);//Entrada do botao lateral 1 pinMode(botltr1,OUTPUT);//saida botao lateral 1 pinMode(bot2LTR,INPUT_PULLUP);// Entrada do botao lateral 2 pinMode(botltr2,OUTPUT);//saida botao lateral 2 pinMode(botMODE,INPUT_PULLUP);// Entrada do botao CPI do mouse}//fim do void setupvoid loop(){Pressed_Mode;//perfil normalif(mode == 0){//Serial.println("normal"); Pressed_Dir; Pressed_Esq; Pressed_1Ltr; Pressed_2Ltr; Pressed_Ctr; }//perfil sniperif(mode == 1){//Serial.println("sniper"); Pressed_Esq_Scope; Pressed_Dir; Pressed_1Ltr; Pressed_2Ltr; Pressed_Ctr; }//perfil 3balas por vezif(mode == 2){//Serial.println("3balas"); Pressed_Dir; Pressed_Esq_3kill; Pressed_1Ltr; Pressed_2Ltr; Pressed_Ctr; }//perfil baionetaif(mode == 3){//Serial.println("baioneta"); Pressed_Dir; Pressed_Esq; Pressed_Ctr_3; Pressed_1Ltr; Pressed_2Ltr; }//perfil misto scope+baionetaif(mode == 4){// Serial.println("scope e baioneta"); Pressed_Esq_Scope; Pressed_Dir; Pressed_Ctr_3; Pressed_1Ltr; Pressed_2Ltr; }}//fim do void loop
Em anexo segue fotos de esquema e sketch, bom projeto!…
coisas que podemos criar.
Agora que sabemos controlar o servomotor pelo potenciômetro sem muito esforço, vamos remover o potenciômetro e fazer com que o nosso computador envie comandos para o arduino controlar o que o servomotor deve fazer.
Concluindo esta etapa podemos criar um servidor Web utilizando Ruby e o Sinatra que vimos nos post anteriores para controlar via internet nosso servomotor.
O que vamos utilizar neste projeto:
- Arduino Uno
- Protoboard
- Servomotor
Vamos utilizar a biblioteca do servomotor (servo.h) vamos utilizar a serialport, além do ruby e do sinatra.
Fritzing:
Código:
01
#include <Servo.h>
02
03
Servo myservo; // create servo object to control a servo
04
// a maximum of eight servo objects can be created
05
06
int posE = 175;
07
int posD = 0; // variable to store the servo position
08
int pos = 90;
09
10
void setup()
11
{
12
Serial.begin(9600);
13
myservo.attach(9); // attaches the servo on pin 9 to the servo object
14
myservo.write(pos);
15
}
16
17
void loop() {
18
19
if(Serial.available() > 0)
20
{
21
int entrada = Serial.read();
22
23
switch (entrada){
24
case 'D':
25
direita();
26
break;
27
28
case 'E':
29
esquerda();
30
break;
31
32
case 'R':
33
centro();
34
break;
35
36
}
37
}
38
}
39
void centro(){
40
myservo.write(pos);
41
}
42
void direita(){
43
myservo.write(posD);
44
}
45
void esquerda(){
46
myservo.write(posE);
47
}
application.rb
Neste código ruby vamos adicionar todas as gems que nosso projeto ira precisar, carregando a index em Haml para receber os dados de quando cada botão for pressionado o javascript se encarrega da função de identificar cada tecla.
01
# vamos adigionar as gens que vamos utilizar
02
%w[rubygems sinatra haml serialport].each{ |gem| require gem }
03
04
# parametros da serialport
05
port_str = "/dev/cu.usbmodem621" #varia de acordo com seus dispositivos
06
baud_rate = 9600
07
data_bits = 8
08
stop_bits = 1
09
parity = SerialPort::NONE
10
11
sp = SerialPort.new(port_str, baud_rate, data_bits, stop_bits, parity)
12
13
get '/' do
14
haml :index
15
end
16
17
post '/envia' do
18
command = params[:cmd]
19
sp.write(command +"\r\n")
20
end
js/script.js
01
$(document).ready(function(){
02
$(document).keypress(function(e){
03
switch(e.charCode){
04
case 119:
05
Envia('R');
06
break;
07
case 100:
08
Envia('D');
09
break;
10
case 97:
11
Envia('E');
12
break;
13
}
14
})
15
$('.btn').click(function() {
16
Envia($(this).text())
17
})
18
});
19
20
function Envia(command) {
21
$.ajax({
22
url: '/envia',
23
type: 'POST',
24
data: { cmd: command },
25
error: function(){},
26
success: function() {}
27
})
28
}
Criei uma interface, um layout básico utilizando o twitterbootstrap
Com o ambiente corretamente instalado, podemos inicializar o application.rb com o comando:
ruby application.rb
O servidor vai iniciar, e temos uma aplicação sinatra e ruby controlando o arduino.
Você pode baixar todo código do projeto clicando aqui.
…
ggable controllers, meaning //you must always either restart your Arduino after you conect the controller, //or call config_gamepad(pins) again after connecting the controller.int error = 0; byte type = 0;byte vibrate = 0;
const int stepsPerRevolution = 200; // numero de passos totais do motor// initialize the stepper library on pins 8 through 11:Stepper myStepper(stepsPerRevolution, A0, A1, A2, A3);
//Declaração dos Leds int LEDy = 9; int LEDx = 6; int LEDX = 5; int LEDY = 3; int brilloLedY = 0; // variable para guardar el valor con el que se iluminara el led int brilloLedx = 0; // variable para guardar el valor con el que se iluminara el led int brilloLedX = 0; // variable para guardar el valor con el que se iluminara el led int brilloLedy = 0; // variable para guardar el valor con el que se iluminara el led
void setup(){ Serial.begin(57600); // set the speed at 30 rpm: myStepper.setSpeed(150);
//Definição de LedspinMode(LEDX, OUTPUT);pinMode(LEDx, OUTPUT);pinMode(LEDY, OUTPUT);pinMode(LEDy, OUTPUT);
//CHANGES for v1.6 HERE!!! **************PAY ATTENTION************* error = ps2x.config_gamepad(13,11,10,12, true, true); //setup pins and settings: GamePad(clock, command, attention, data, Pressures?, Rumble?) check for error if(error == 0){ Serial.println("Found Controller, configured successful"); Serial.println("Try out all the buttons, X will vibrate the controller, faster as you press harder;"); Serial.println("holding L1 or R1 will print out the analog stick values."); Serial.println("Go to www.billporter.info for updates and to report bugs."); } else if(error == 1) Serial.println("No controller found, check wiring, see readme.txt to enable debug. visit www.billporter.info for troubleshooting tips"); else if(error == 2) Serial.println("Controller found but not accepting commands. see readme.txt to enable debug. Visit www.billporter.info for troubleshooting tips"); else if(error == 3) Serial.println("Controller refusing to enter Pressures mode, may not support it. "); //Serial.print(ps2x.Analog(1), HEX); type = ps2x.readType(); switch(type) { case 0: Serial.println("Unknown Controller type"); break; case 1: Serial.println("DualShock Controller Found"); break; case 2: Serial.println("GuitarHero Controller Found"); break; } }
void loop(){ /* You must Read Gamepad to get new values Read GamePad and set vibration values ps2x.read_gamepad(small motor on/off, larger motor strenght from 0-255) if you don't enable the rumble, use ps2x.read_gamepad(); with no values you should call this at least once a second */ if(error == 1) //skip loop if no controller found return; if(type == 2){ //Guitar Hero Controller ps2x.read_gamepad(); //read controller if(ps2x.ButtonPressed(GREEN_FRET)) Serial.println("Green Fret Pressed"); if(ps2x.ButtonPressed(RED_FRET)) Serial.println("Red Fret Pressed"); if(ps2x.ButtonPressed(YELLOW_FRET)) Serial.println("Yellow Fret Pressed"); if(ps2x.ButtonPressed(BLUE_FRET)) Serial.println("Blue Fret Pressed"); if(ps2x.ButtonPressed(ORANGE_FRET)) Serial.println("Orange Fret Pressed");
if(ps2x.ButtonPressed(STAR_POWER)) Serial.println("Star Power Command"); if(ps2x.Button(UP_STRUM)) //will be TRUE as long as button is pressed Serial.println("Up Strum"); if(ps2x.Button(DOWN_STRUM)) Serial.println("DOWN Strum"); if(ps2x.Button(PSB_START)) //will be TRUE as long as button is pressed Serial.println("Start is being held"); if(ps2x.Button(PSB_SELECT)) Serial.println("Select is being held");
if(ps2x.Button(ORANGE_FRET)) // print stick value IF TRUE { Serial.print("Wammy Bar Position:"); Serial.println(ps2x.Analog(WHAMMY_BAR), DEC); } }
else { //DualShock Controller ps2x.read_gamepad(false, vibrate); //read controller and set large motor to spin at 'vibrate' speed if(ps2x.Button(PSB_START)) //will be TRUE as long as button is pressed Serial.println("Start is being held"); if(ps2x.Button(PSB_SELECT)) Serial.println("Select is being held"); /* if(ps2x.Button(PSB_PAD_UP)) { //will be TRUE as long as button is pressed Serial.print("Up held this hard: "); Serial.println(ps2x.Analog(PSAB_PAD_UP), DEC); } if(ps2x.Button(PSB_PAD_RIGHT)){ Serial.print("Right held this hard: "); Serial.println(ps2x.Analog(PSAB_PAD_RIGHT), DEC); } if(ps2x.Button(PSB_PAD_LEFT)){ Serial.print("LEFT held this hard: "); Serial.println(ps2x.Analog(PSAB_PAD_LEFT), DEC); } if(ps2x.Button(PSB_PAD_DOWN)){ Serial.print("DOWN held this hard: "); Serial.println(ps2x.Analog(PSAB_PAD_DOWN), DEC); } */ vibrate = ps2x.Analog(PSAB_BLUE); //this will set the large motor vibrate speed based on //how hard you press the blue (X) button if (ps2x.NewButtonState()) //will be TRUE if any button changes state (on to off, or off to on) { if(ps2x.Button(PSB_L3)) Serial.println("L3 pressed"); if(ps2x.Button(PSB_R3)) Serial.println("R3 pressed"); if(ps2x.Button(PSB_L2)) Serial.println("L2 pressed"); if(ps2x.Button(PSB_R2)) Serial.println("R2 pressed"); if(ps2x.Button(PSB_GREEN)) Serial.println("Triangle pressed"); } if(ps2x.ButtonPressed(PSB_RED)) //will be TRUE if button was JUST pressed Serial.println("Circle just pressed"); if(ps2x.ButtonReleased(PSB_PINK)) //will be TRUE if button was JUST released Serial.println("Square just released"); if(ps2x.NewButtonState(PSB_BLUE)) //will be TRUE if button was JUST pressed OR released Serial.println("X just changed"); if(ps2x.Button(PSB_L1) || ps2x.Button(PSB_R1)) // print stick values if either is TRUE { Serial.print("Stick Values:"); Serial.print(ps2x.Analog(PSS_LY), DEC); //Left stick, Y axis. Other options: LX, RY, RX Serial.print(","); Serial.print(ps2x.Analog(PSS_LX), DEC); Serial.print(","); Serial.print(ps2x.Analog(PSS_RY), DEC); Serial.print(","); Serial.println(ps2x.Analog(PSS_RX), DEC); } //fim do if(ps2x...)
//Transforma este valor en el valor que usaremos para el led Para ello usaremos la funcion map() int a = map(ps2x.Analog(PSS_LY), 100, 1, 4, 250); if(a > 0){ brilloLedY = a;}else{brilloLedY = 0;} analogWrite(LEDY, brilloLedY); if(brilloLedY > 0 && brilloLedY < 100){ // step one revolution in one direction: myStepper.step(1); } if(brilloLedY >= 100 && brilloLedY <= 255){ // step one revolution in one direction: myStepper.step(20); } //Transforma este valor en el valor que usaremos para el led Para ello usaremos la funcion map() int b = map(ps2x.Analog(PSS_LY), 155, 255, 4, 255); if(b > 0 && b< 256){ brilloLedy = b;}else{brilloLedy = 0;} analogWrite(LEDy, brilloLedy); if(brilloLedy > 0 && brilloLedy < 100){ // step one revolution in one direction: myStepper.step(-1); } if(brilloLedy >= 100 && brilloLedy <= 255){ // step one revolution in one direction: myStepper.step(-20); } //Transforma este valor en el valor que usaremos para el led Para ello usaremos la funcion map() int c = map(ps2x.Analog(PSS_LX), 100, 1, 4, 250); if(c > 0){ brilloLedx = c;}else{brilloLedx = 0;} analogWrite(LEDx, brilloLedx); //Transforma este valor en el valor que usaremos para el led Para ello usaremos la funcion map() int d = map(ps2x.Analog(PSS_LX), 155, 255, 4, 255); if(d > 0 && b< 256){ brilloLedX = d;}else{brilloLedX = 0;} analogWrite(LEDX, brilloLedX); Serial.println(brilloLedy); }//fim do else dualshockcontroller delay(5); }…