
Аналоговый джойстик используется как устройство ввода для изменения положения курсора в соответствии с движением джойстика.
Он выдает аналоговые напряжения в направлениях 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); } }