라즈베리파이3 B+ 조이스틱 구현 with C

김봉조·2019년 10월 16일
0
post-thumbnail

라즈베리파이3 B+ 조이스틱 구현 with C

찾아도 안 보이길래 그냥 10분만에 뚝딱 테스트 함.

조이스틱(Joystick)은 '스틱'이라 불리는 긴 막대형의 레버를 잡고 상하좌우로 밀거나 당겨서 조작하는 방식의 컨트롤러/입력장치로, 항공기의 보조날개와 승강타를 조종하기 위한 기계 장치로 개발되었다. 게이밍 기어 및 산업현장에서의 장비 제어 컨트롤러로도 종종 사용되며 항공기 등의 조종간으로서도 널리 사용된다. FBW를 적용한 항공기들의 경우 그 이전 세대의 항공기들과는 달리 유압식 조종간 대신 조이스틱 방식의 전자식 조종간을 널리 사용하는 편으로, 위치에 따라 사이드스틱이나 센터스틱 등으로 불린다. 현재 시판되는 게이밍용 조이스틱으로는 크게 디지털 조이스틱과 아날로그 조이스틱으로 나눌 수 있다. 과거 PC에서는 조이스틱하면 거의 무조건 플라이트 시뮬레이션을 위한 조종간인 아날로그 스틱을 의미했다.(출처 나무위키)

주의: 라즈베리파이에는 ADC 컨버터가 없으므로 MCP3208 사용법을 숙지하고 진행한다.
라즈베리파이와 MCP3208 ADC 컨버터 사용하기 - 회로와 소스코드

소스코드

#
#MCP3208 ADC device using the SPI bus.
#
# Digital SW & Analogue joystick version!
#
# Author : girin - KyunHa
# Date   : 2019. 10. 12
#
# https://www.diymaker.net/
#

#include <stdio.h> 
#include <string.h> 
#include <errno.h> 
#include <wiringPi.h> 
#include <wiringPiSPI.h> 

#define CS_MCP3208 8 //GPIO 8 
#define SPI_CHANNEL 0 
#define SPI_SPEED 1000000 //1Mhz

#define JOYSW 21

// spi communication with Rpi and get sensor data 

int read_mcp3208_adc(unsigned char adcChannel) 
{
	unsigned char buff[3];
	int adcValue = 0;
	
	buff[0] = 0x06 | ((adcChannel & 0x07) >> 2);
	buff[1] = ((adcChannel & 0x07) << 6);
	buff[2] = 0x00;
	
	digitalWrite(CS_MCP3208, 0);
	wiringPiSPIDataRW(SPI_CHANNEL, buff, 3);
	
	buff[1] = 0x0f & buff[1];
	adcValue = (buff[1] << 8 ) | buff[2];
	
	digitalWrite(CS_MCP3208, 1);
	
	return adcValue;
}

int main(void) {
	
	unsigned char adcChannel_joystickX = 3;
	unsigned char adcChannel_joystickY = 2;

	int joystick_x = 0;
	int joystick_y = 0;

	float vout_light;
	float vout_oftemp;
	float percentrh = 0;
	float supsiondo = 0;
	
	
	
	printf("start");

	
	if(wiringPiSetup() == -1)
	{
		fprintf(stdout, "Unable to start wiringPi :%s\n", strerror(errno));
		return 1;
	}
	
	pinMode(JOYSW, INPUT);
	
	if(wiringPiSPISetup(SPI_CHANNEL, SPI_SPEED) == -1)
	{
		fprintf(stdout, "wiringPiSPISetup Failed :%s\n", strerror(errno));
		return 1;
	}
	
	pinMode(CS_MCP3208, OUTPUT);
	
	while(1)
	{
		joystick_x = read_mcp3208_adc(adcChannel_joystickX);
		joystick_y = read_mcp3208_adc(adcChannel_joystickY);
		
		if(digitalRead(JOYSW) == 0)
			printf("ON!   ");
		else
			printf("OFF!  ");		
		
		//printf("Humiity = %u temparature = %u\n", adcValue_humi, adcValue_temp);
		printf("joystick_x = %u   joystick_y = %u\n", joystick_x, joystick_y);
		
		delay(200);
	}
	return 0;
}
profile
소프트박스코딩

0개의 댓글