Аналоговый джойстик используется как устройство ввода для изменения положения курсора в соответствии с движением джойстика.
Он выдает аналоговые напряжения в направлениях X и Y, соответствующих положению джойстика.
Эти напряжения могут быть обработаны для определения положения курсора или для перемещения курсора в соответствии с положением джойстика.
Для получения дополнительной информации об аналоговом джойстике и о том, как его использовать, обратитесь к статье «Аналоговый джойстик» в разделе «Датчики и модули».
Для обработки аналоговых сигналов нам нужно использовать АЦП на микроконтроллере. Для получения информации об АЦП в PIC18 и о том, как его использовать, обратитесь к статье АЦП в PIC18.
Схема подключения аналогового джойстика
Для примера работы аналогового джойстика подключим его к PIC18F4550. На LCD16x2 будем отображать цифровое значение для XY во время движения.
Что бы было взаимодействие между джойстиком и PIC18F4550 нам необходимо подключить выходные контакты X и Y джойстика к каналам АЦП микроконтроллера. Прочитав значение АЦП контактов X и Y, мы можем определить положение джойстика.
Кроме того, мы показываем движение джойстика на ПК с помощью Matlab. В Matlab мы читаем Serial Port, который принимает значение, отправляемое микроконтроллером PIC18F4550 последовательно.
Архив проекта подключения джойстика к PIC
Пример кода
/*
Аналоговый джойстик с PIC18f4550
www.rxtx.su
*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <p18f4550.h>
#include "Configuration_Header_File.h"
#include "LCD_16x2_8-bit_Header_File.h"
#include "PIC18F4550_ADC_Header_File.h"
#include "USART_Header_File.h"
void main()
{
char data[10],data1[10];
int x,y;
OSCCON=0x72; /*Установим частоту на 8 Мгц*/
LCD_Init(); /*инициализация 16x2 LCD*/
ADC_Init(); /*Инициализация АЦП 10-бит*/
USART_Init(9600);
while(1)
{
x=ADC_Read(0);
sprintf(data,"%d ",x); /* конвертируем считанное значение АЦП первого канала в строку */
LCD_String_xy(0,0,data); /* выводим строку на экран */
USART_SendString(data);
MSdelay(90);
y=ADC_Read(1);
sprintf(data1,"%d ",y); /* конвертируем считанное значение АЦП второго канала в строку */
LCD_String_xy(0,6,data1); /* выводим строку на экран */
USART_SendString(data1);
MSdelay(90);
USART_TxChar(0x0A);
USART_TxChar(0x0D);
memset(data,0,10);
memset(data1,0,10);
}
}



