#1 2017-03-15 21:54:04

SystemDi
Учасник
Зареєстрований: 2017-03-15
Повідомлень: 1

Кнопка и джойстик одновременно

Привет парни, если есть возможность подскажите пожалуйста ... к Ардуино подключен джойстик и кнопка .. как одновременно считать значения с аналоговых входов для джойстика и цыфрового входа для конопки ??? То есть мне надо что б когда я управляю джойстиком можно было паралельно (при нажатом джойстике) управлть и кнопкой ?? Мой не паралельный код
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
#define axis_X 0 
#define axis_Y 1
int buttonPin =5;
int buttonPin2 =6;
int buttonState = 0;

RF24           radio(9, 10);
                               
void setup(){
    pinMode(buttonPin,INPUT);
    pinMode(buttonPin2,INPUT);
    Serial.begin(9600);
   
    radio.begin();
   
    radio.setChannel(5);
    radio.setDataRate     (RF24_1MBPS);
    radio.setPALevel      (RF24_PA_HIGH);
    radio.openWritingPipe (0x1234567890LL);
   
   
}
void loop(){
    int data;
    if (buttonState = digitalRead(buttonPin) ){
        data = 2;
        radio.write(&data, sizeof(data));
      }
   

    while(analogRead(axis_X)>900 && analogRead(axis_X)<1024)  {
        data = 4;
        radio.write(&data, sizeof(data));
    }

    while(analogRead(axis_X)>-1 && analogRead(axis_X)<100)  {
        data = 5;
        radio.write(&data, sizeof(data));
    }

    while(analogRead(axis_Y)>900 && analogRead(axis_Y)<1024)  {
        data = 6;
        radio.write(&data, sizeof(data));
    }

    while(analogRead(axis_Y)>-1 && analogRead(axis_Y)<100)  {
        data = 7;
        radio.write(&data, sizeof(data));
    }

}

Неактивний

#2 2017-03-16 08:15:27

vvr
Учасник
Зареєстрований: 2015-04-12
Повідомлень: 875

Re: Кнопка и джойстик одновременно

дык придумай для кнопки свою переменную и передавай две - кнопки и джойстика

Неактивний

#3 2017-03-16 10:37:19

NoName
Customer
З Київ
Зареєстрований: 2014-07-08
Повідомлень: 1,446

Re: Кнопка и джойстик одновременно

собирается? 
не проверял синтаксис


#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
#define axis_X 0  
#define axis_Y 1
int buttonPin =5;
int buttonPin2 =6;
int buttonState = 0;
RF24           radio(9, 10);
                               
void setup(){
    pinMode(buttonPin,INPUT);
    pinMode(buttonPin2,INPUT);
    Serial.begin(9600);
    
    radio.begin();
    
    radio.setChannel(5);
    radio.setDataRate     (RF24_1MBPS);
    radio.setPALevel      (RF24_PA_HIGH);
    radio.openWritingPipe (0x1234567890LL);
   
    
}


#define buttom_key   0x01 
#define joy_x_left   0x02 
#define joy_x_rigth  0x04

#define joy_y_up    0x08 
#define joy_y_down  0x10

typedef enum {
TIMER_EXE       = 0,
TIMER_DISABLED  = 1,
TIMER_RUN       = 2,
}TE_TIMER;

TE_TIMER system_delay_uint32 ( unsigned long *timer , unsigned long shift )
{
    if ( *timer > 0 )
    {
      if (*timer > shift )
      {
        *timer -= shift;
        return TIMER_RUN;
      }
       else
      { // save delta time
         *timer =  ( shift - *timer );
         return TIMER_EXE;
      }
    }
  return TIMER_DISABLED;
}


// main cycle 
void loop() 
{
static unsigned long   hw_old_system_timer = 0; 
        unsigned long  hw_current_system_timer = 0; 

 unsigned long  delta_task_timer; 
 TE_TIMER  status; 

    unsigned char 					data = 0;
	static     unsigned char    old_data = 0xff;
    
    int jx = 0; 
    int jy = 0; 
  	
    if ( buttonState = digitalRead(buttonPin) )
    {
        data |= buttom_key ;
    }     
   
    jx =  AnalogRead(axis_X);
    jy  = AnalogRead(axis_Y);
   
   
    //  user limits, emu 4 key
    if (( jx > 900 )   data |= joy_x_rigth;
    if (( jx < 100 )   data |= joy_x_left;
    
	if (( jy > 900 )   data |= joy_y_up;
    if (( jy < 100 )   data |= joy_y_down;
 	
    if ( data != old_data)
    {
     radio.write(&data, sizeof(data)); //  unit8_t
     old_data = data;
     task_time = 1000;   // reset timer 
   }
	
    hw_current_system_timer  = millis();
	delta_task_timer         = hw_current_system_timer - hw_old_system_timer;
	hw_old_system_timer      = hw_current_system_timer;

   status = system_delay_uint32 ( &task_time, delta_task_timer );
   switch ( status )
  {
    case TIMER_EXE:
    case TIMER_DISABLED:
        task_time += 1000; 
		radio.write(&data, sizeof(data)); // test,  every 1 sec
    break;
     case TIMER_RUN:
     break;   
 }	
}

распаковывать 

if ( data &  buttom_key    ) {}
if ( data &  joy_x_left    ) {}
if ( data &  joy_x_rigth   ) {}
if ( data &  joy_y_up      ) {}
if ( data &  joy_y_down    ) {}


либо   передавать структуру с данными
typedef struct
{
int jx;
int jy;
int status;  // buttom & servcive data
}  td_joy; 

и на приемнике обрабатывать если исполнительный механизм медленный, иначе передайте байт

Остання редакція NoName (2017-03-16 12:01:11)

Неактивний

#4 2017-03-17 00:10:27

qwone
Учасник
Зареєстрований: 2016-07-25
Повідомлень: 143

Re: Кнопка и джойстик одновременно

Мой вариант воспользоваться классом джойстик Полный скетч здесь https://yadi.sk/d/x92BFogP3G2iiB
Код главного файла выкладываю

/* Class_do_joystic.ino 
  #1 джойстик VRx ->A0 (VRx_pin)
              VRy ->A1 (VRy_pin)
               SW ->A2 (SW_pin)
  Принцип кода:Отработать джойстик
*/
//#1 Джойстик
#include "Cl_do_joystic.h"
const byte VRx_pin = A0;
const byte VRy_pin = A1;
const byte SW_pin = A2;
void Do_VRx(void);
void Do_VRy(void);
void Do_SW(void);
Cl_do_joystic Joystic(VRx_pin, VRy_pin, SW_pin,     // пины для подключения джойстика
                      0,                            // 0 - уровень наж кнопке SW
                      & Do_VRx, & Do_VRy, & Do_SW); // какую функцию надо сделать
void Do_VRx(void) {
  Serial.print("VRx= ");
  Serial.println(Joystic.VRx);
}
void Do_VRy(void) {
  Serial.print("VRy= ");
  Serial.println(Joystic.VRy);
}
void Do_SW(void) {
  Serial.println("Press SW");
}
void setup() {
  Serial.begin(9600);
  //#1 Джойстик
  Joystic.setup();
}
void loop() {
  //#1 Джойстик
  Joystic.loop();
}

Неактивний

Швидке повідомлення

Введіть повідомлення і натисніть Надіслати

Підвал форуму