управление с клавиатуры

Snecky
Offline
Зарегистрирован: 24.01.2012

Здрасти ...помогите плиз разобратся мне нубу с управлением с клавиатуры того же самого светодиода.... с цыфрами я разобрался но если вдруг задача с букв клавиатуры управлять ?? не пойму как это делать ?

например D-светодиод загорелся, а F-выключился 

maksim
Offline
Зарегистрирован: 12.02.2012

А клавиатура у вас куда подключена? Скейтч ваш можно посмотреть?  

Snecky
Offline
Зарегистрирован: 24.01.2012

да простое подключение по сериал порту (клава от компа) 

maksim
Offline
Зарегистрирован: 12.02.2012

Так не бывает. Еще раз спрашиваю как и куда подключена клавиатура???? И где ваш скейтч???? 

maksim
Offline
Зарегистрирован: 12.02.2012

Snecky пишет:

да простое подключение по сериал порту (клава от компа) 

А эта фраза может означать, что влавиатура подключена к дуине двумя проводами к 0(RX) и GND. НО я не встречал UART клавиатур с TTL уровнями от компа.

maksim
Offline
Зарегистрирован: 12.02.2012

Выложите хотябы скейтч, по нему будет ясно как у вас подключена клавиатура.... 

Snecky
Offline
Зарегистрирован: 24.01.2012

int ledPin=13;
void setup() 
{                

Serial.begin(9600);
pinMode (ledPin, OUTPUT);
}

void loop(){
  
  while (Serial.available() == 0);
  int val=Serial.read() - '0';
 
  if (val==1)  //заменить на букву
 
  {
   Serial.println("ON");
  digitalWrite(ledPin, HIGH);
  }
  if (val == 0)   //заменить на букву
  {
  Serial.println("OFF");
  digitalWrite(ledPin, LOW);
  }
}

 

maksim
Offline
Зарегистрирован: 12.02.2012

Клавиатура у вас подключена к компу и вы просто отсылаете символы в сериал порт. У вас этот код работает?

Snecky
Offline
Зарегистрирован: 24.01.2012

 да именно так ! да работает 

maksim
Offline
Зарегистрирован: 12.02.2012

Да, вижу, работает, только из-за того что в конце 11 строки стоят ; от этой стрроки нет никакого толку, чтение из порта происходит постоянно.

int ledPin=13;
void setup() 
{                

  Serial.begin(9600);
  pinMode (ledPin, OUTPUT);
}

void loop(){

  while (Serial.available()){
    int val=Serial.read() - '0';

    if (val == 1)  //заменить на букву 
    {
      Serial.println("ON");
      digitalWrite(ledPin, HIGH);
    }
    if (val == 0)   //заменить на букву
    {
      Serial.println("OFF");
      digitalWrite(ledPin, LOW);
    }
  }
}

 

maksim
Offline
Зарегистрирован: 12.02.2012

А что бы включать и выключать светодиод в зависимости от символа код будет еще проще, нужно то что вы прочитали из порта сохранить в переменную char и после просто сравнивать эту переменную с условием:

int ledPin=13;
void setup() 
{                
  Serial.begin(9600);
  pinMode (ledPin, OUTPUT);
}

void loop(){
  while (Serial.available()){
    char val = Serial.read();

    if (val == 'D')  
    {
      Serial.println("ON");
      digitalWrite(ledPin, HIGH);
    }
    if (val == 'F')  
    {
      Serial.println("OFF");
      digitalWrite(ledPin, LOW);
    }
  }
}

 

maksim
Offline
Зарегистрирован: 12.02.2012

Да и не забывайте что D и F в данном случае должны быть заглавными. И я еще не обратил внимания, что  while (Serial.available() == 0); так что я подредактировал предыдущие примеры.

Snecky
Offline
Зарегистрирован: 24.01.2012

maksim спасибо большое ! только начал разбиратся с ардуино .... 

maksim
Offline
Зарегистрирован: 12.02.2012

И в общем использовать такой способ while (Serial.available() == 0){} не совсем правильно, так как в этом случае у вас программа будет крутиться в замкнутом цикле пока что-нибудь не прийдет в порт и вы не сможете занять МК другими делами...

Snecky
Offline
Зарегистрирован: 24.01.2012

а вот еще вопрос возник ! включать и выключать светодиод с одной клавиши ? допустим с 'D' ? 

maksim
Offline
Зарегистрирован: 12.02.2012

Как то так

#define ledPin 13
bool state = 0;

void setup() 
{                
  Serial.begin(9600);
  pinMode (ledPin, OUTPUT);
}

void loop()
{
  while(Serial.available())
  {
    char val = Serial.read();
    
    if (val == 'D') state = !state;
    
    if(state)
    {
      Serial.println("ON");
      digitalWrite(ledPin, HIGH);
    }
    else
    {
      Serial.println("OFF");
      digitalWrite(ledPin, LOW);
    }
  }
}

 

desant
Offline
Зарегистрирован: 18.12.2012

Здравствуйте! Нужна помощ с управление платформы с клавиатуры. то есть так: ардуино управляет двигателями через драйвер, на ардуино посылаю с компьютера через блутуз цифры (например 1 правый колесо назад). Все работает, даже прогу в визул бейсике сделал с кнопками. Но управлять не удобно. Задача при нажатой клавише допустим 1 платворма ехала при отпускании она останавливалась. скетч:

 

#include "DualVNH5019MotorShield.h"
DualVNH5019MotorShield md;
 
void setup()
{
Serial.begin(9600);
Serial.println("Dual VNH5019 Motor Shield");
Serial.flush(); //очищает буфер
md.init();
}
void loop()
 {while (Serial.available());
  int val = Serial.read()- '0';
  
  if (val == 1) //правое назад
{
  for (int i = 0; i <= 100; i++)
{
md.setM1Speed(i);
delay(0);
}
Serial.print("pravii nazad"); //посылает на комп правый назад
}
 
 else if (val == 3) //правое вперед
{
  for (int i = 0; i >= -200; i--)
{
md.setM1Speed(i);
delay(0);
}}
 else if (val == 2) //левое назад
{
  for (int i = 0; i <= 200; i++)
{
md.setM2Speed(i);
delay(0);
}}
 
 else if (val == 4) //левое вперед
{
  for (int i = 0; i >= -200; i--)
{
md.setM2Speed(i);
delay(0);
}}
 
 else if (val == 0) //стоп
 {   int i = 0;
 {
   md.setM1Speed(i);
   md.setM2Speed(i);
 }
 }
}
Mamaley
Offline
Зарегистрирован: 02.09.2015

Добрый день !

Помогите пожалуйста.

Нужен код для управления реле клавишами W.S.A.D. , но ,что-бы релюшки срабатывали только пока держишь кнопку...