외부 장치용 C 프로그램. PC 하드웨어 및 소프트웨어. USB를 통한 부하 제어

저자는 컴퓨터를 이용하여 각종 전기 및 무선기기를 제어하는 ​​프로그램과 장치를 개발하였다. 장치는 COM 포트 중 하나에 연결되며 화면 키와 외부 센서를 모두 사용하여 장치를 제어할 수 있습니다.

장치 다이어그램은 다음과 같습니다. 그림 1.그 기반은 직렬 입력과 직렬 및 병렬 정보 출력을 갖춘 8비트 시프트 레지스터인 74HC595 칩입니다. 병렬 출력은 세 가지 상태를 갖는 출력이 있는 버퍼 레지스터를 통해 수행됩니다. 정보 신호는 SER 입력(핀 14)에, 쓰기 신호는 SCK 입력(핀 11)에, 출력 신호는 RSK 입력(핀 12)에 공급됩니다. DA1 칩에는 DD1 레지스터에 전원을 공급하는 5V 전압 조정기가 포함되어 있습니다.

그림 1. 장치 다이어그램

장치는 컴퓨터의 COM 포트 중 하나에 연결됩니다. 정보 신호는 XS1 소켓의 핀 7에 도착하고, 정보 기록 신호는 핀 4에, 정보 출력 신호는 핀 3에 도착합니다. RS-232 표준에 따르면 COM 포트 신호의 레벨은 약 -12V(log. 1) 및 약 +12V(log.0)입니다. 이 레벨은 저항 R2, R3, R5 및 안정화 전압 5.1V의 제너 다이오드 VD1-VD3을 사용하여 레지스터 DD1의 입력 레벨과 쌍을 이룹니다.

외부 장치에 대한 제어 신호는 레지스터 DD1의 출력 Q0-Q7에서 생성됩니다. 하이 레벨은 마이크로 회로의 공급 전압(약 5V)과 동일하고 로우 레벨은 0.4V 미만입니다. 이 신호는 정적이며 DD1의 RSK 입력(핀 12)에 하이 레벨이 도달하면 업데이트됩니다. 등록하다. LED HL1-HL8은 장치 작동을 모니터링하도록 설계되었습니다.

이 장치는 저자가 개발한 UmiCOM 프로그램을 사용하여 제어됩니다. 기본 프로그램 창의 모양은 다음과 같습니다. 그림 2.

그림 2. UniCOM 프로그램의 모습

시작한 후에는 비어 있는 COM 포트와 출력 전환 속도를 선택해야 합니다. 각 장치 출력의 상태는 테이블 행에 입력됩니다(높은 레벨 - 1, 낮은 레벨 - 0 또는 비어 있음). 작동 주기의 테이블 열을 통한 프로그램 "정렬"은 장치 출력에서 ​​해당 논리 레벨을 설정합니다. 테이블에 입력된 정보는 프로그램 종료 시 자동으로 저장되며, 다음 실행 시 다시 로드됩니다. 명확성을 위해 프로그램 창 왼쪽에는 높은 레벨이 설정된 출력 수가 강조 표시됩니다.

입력 1~3 및 +5V 라인에 연결된 외부 접촉 센서를 사용하여 장치를 제어할 수도 있습니다. 접점을 닫거나 열려면 작동해야 합니다. 센서 연결 다이어그램의 예는 다음과 같습니다. 그림 3.

그림 3. 접촉식 센서 연결하기

"입력 설정" 소프트 키를 누르면 "입력 및 출력 할당" 창이 열립니다( 그림 4.), 여기서 출력 상태를 변경하는 입력이 선택됩니다. 기본 프로그램 창의 화면 키 "1", "2", "3"을 눌러 입력 작동을 시뮬레이션할 수 있습니다. 논리 레벨을 사용하여 장치를 제어할 수 없는 경우 릴레이를 사용해야 하며 연결 ​​다이어그램은 다음과 같습니다. 그림 5또는 트랜지스터 광커플러( 그림 6.).

그림 4. 입력 및 출력 매칭

그림 5. 릴레이 연결 다이어그램

그림 6. 트랜지스터 옵토커플러 연결 다이어그램

대부분의 부품은 두께가 1~1.5mm인 단면 호일 유리 섬유 라미네이트로 만들어진 인쇄 회로 기판에 장착됩니다. 그림은 그림에 나와 있습니다. 그림 7.저항 R1-R6은 소켓 XS1의 단자에 장착됩니다.

그림 7. PCB 도면

이 장치는 저항 C2-23을 사용합니다. MLT, 산화물 커패시터 - K50-35 또는 수입품, XS1 소켓 - DB9F. 다이어그램에 표시된 제너 다이오드 외에도 BZX55C5V1 또는 국내 KS174A, 모든 LED를 사용할 수 있습니다. 이 장치는 전압 12V, 전류 최대 100mA의 안정화 또는 불안정 전원에서 전원을 공급받습니다.

스위칭 속도

COM 포트 선택

시작 및 일시 정지 버튼

(포트 활성화)

정지 버튼

(포트 비활성화)

출력 설정 버튼

수동 버튼

제어 입력(1, 2, 3)

표 지우기 버튼

도움말 버튼

종료 버튼

시뮬레이션하는 지표

출력 동작

값이 포함된 테이블 그리드

(빈 셀
0과 같음)

예를 들어 24V와 같은 일정한 전압으로 회로의 부하를 제어하려면 강력한 복합 트랜지스터(이 경우 KT829)를 사용할 수 있습니다.

220V 교류를 전환하는 가장 쉬운 방법은 소위 반도체 교류 스위치를 사용하는 것입니다. 이 스위치에는 갈바닉 절연을 제공하는 입력에 위상 0 감지기가 있는 광드라이버가 있습니다.

스위칭 전류를 높이기 위해 라디에이터에 트라이악이 설치됩니다. 고전압 부품에는 0.5W 전력의 저항이 사용됩니다.

잊지 마세요 안전 예방 조치 - 스위치 동작 중에는 노출된 부품을 만지지 마시고, 부품 및 배선을 재납땜할 때에는 스위치를 네트워크에서 분리하세요.

보드는 단면 호일 PCB로 만들어졌습니다. 보드 크기 30x25mm. 점퍼는 마이크로회로 하우징 아래의 보드에 납땜되어 있습니다. 납땜 중 미세 회로의 과열을 방지하기 위해 미세 회로용 16핀 패널이 사용됩니다.

출력(LED)을 제어하려면 장치를 4선 코드로 PC에 연결하기만 하면 됩니다. 코드는 COM 포트(DB9 소켓)의 표준 커넥터에 납땜되어 있습니다.

디지털 입력의 공통 와이어에 대한 +5V 신호는 장치 회로에서 가져옵니다. 디지털 입력 라인의 저항기는 DB9 소켓 하우징에 납땜할 수 있습니다.

버튼, 토글 스위치, 마이크로 스위치를 디지털 입력에 연결할 수 있습니다.

참고정보

장치의 기본은 출력 잠금 기능이 있는 직렬 시프트 레지스터인 사용 가능한 74hc595 칩입니다. 이 미세 회로를 제어하려면 세 개의 신호 라인으로 충분합니다. 우리의 경우 신호는 UniCOM 제어 프로그램에서 시작되고 RS-232 인터페이스(COM 포트)를 통해 발행됩니다. 9핀 커넥터 라인은 이 인터페이스에서 신호 라인으로 사용됩니다: RTS - 7핀, DTR - 4핀 및 TxD - 3핀.

74hc595 마이크로 회로의 작동 원리는 DS 입력(14핀)에 공급되는 하이 레벨 및 로우 레벨 논리 신호를 순차적으로 기록하는 것입니다. 기록은 SH_CP 입력(핀 11)의 하강 에지(논리 1에서 논리 0으로의 전환)에 의해 수행됩니다. 기록된 데이터의 출력도 하강 에지에서 발생하지만 ST_CP 입력(12번째 레그)에서 발생합니다. 따라서 마지막 8개의 녹음된 신호 레벨이 핀 1-7 및 15에 나타납니다.

출력(핀 1-7 및 15)의 높은 신호 레벨은 마이크로 회로의 공급 전압(이 경우 +5V)에 해당하고 낮은 레벨은 0V에 해당합니다. 출력 신호는 정적입니다. 다음 펄스가 ST_CP 입력(12번째 레그)에 도착할 때까지 변경되지 않습니다. 공급 전압이 최소 레벨 아래로 감소하면 출력 신호가 재설정된다는 점에 유의해야 합니다. 마이크로 회로 문서에 따르면 최소 공급 전압은 2V입니다.

RS-232 인터페이스는 5.1V 제너 다이오드를 사용하여 74hc595 마이크로 회로와 인터페이스됩니다. RS-232 사양에 따르면 높은 신호 레벨은 +3 ~ +25V 범위에 있으므로 UniCOM 제어 프로그램으로 피드백을 구성할 수 있습니다.

요즘에는 모든 전기 수리점과 모든 라디오 아마추어에서 근무일은 PC를 켜는 것으로 시작되고 그 다음에는 보조 전기 장비가 켜집니다. 다른 문제에서는 라디오 아마추어뿐만 아니라 우리 삶의 필수적인 부분이 된 이 "장치"의 많은 사용자가 PC를 켜는 것으로 업무일이 시작됩니다. 그러나 매일 아침에 켜고 저녁에 끄는 경우, 예를 들어 프린터, 액티브 스피커, 테이블 램프 또는 일반 사용자에게서 무엇을 찾을 수 있는지 아는 사람은 조금 지루해집니다. 합의된 목표에 따라 모든 관련 장치를 켜고 끄도록 설계된 부하 스위치를 만드는 것이 목표였습니다. 나는 당신이 저항이 가장 적은 길을 택하고 모든 것에 일반적인 스위치를 둘 수 있다는 데 동의하지만 이것이 라디오 아마추어에게는 그렇지 않은 것 같습니다.훨씬 더 편리하게 수행할 것입니다. 네트워크 필터에 머신을 구축하겠습니다.

장치는 "슬레이브-마스터" 원칙에 따라 장치가 켜지고 꺼지는 사실을 모니터링하므로 가장 쉬운 방법은 USB 포트를 사용하는 것입니다. USB 포트를 사용할 때 장치는 모든 전원을 끄는 전원 공급 장치가 있는 랩톱 및 컴퓨터에서 작동한다는 점을 바로 지적하겠습니다. 예를 들어, 최신 전원 공급 장치 모델에서는 장치가 꺼진 경우에도 +5V USB 포트가 대기 포트로 존재합니다. 장치는 작동하지 않거나 오히려 작동하지만 항상 켜져 있습니다. 여기서는 다른 포트를 신호 소스로 사용해야 하며 그에 따라 소스와 액추에이터의 신호를 조정해야 합니다.

이 장치에서 액추에이터는 16암페어 정격 접점과 5V 코일을 갖춘 계전기입니다. 릴레이를 사용하면 신호 소스와 220V 네트워크의 갈바닉 절연이 제공됩니다.

일련의 실험을 수행한 후 여권 데이터에 따르면 +5V로 전원을 공급할 때 릴레이는 150mA의 전류를 소비하는 것으로 나타났습니다. 데스크톱 컴퓨터를 사용하는 경우 +5V USB 포트가 전원 공급 장치에서 직접 연결되어 부하를 많이 주지 않기 때문에 문제가 없습니다. 위의 모든 사항에 만족한다면 중지하고 아래 다이어그램에 따라 자신만의 버전을 만들 수 있습니다.

그러나 랩톱을 사용하려는 경우 컴퓨터를 통해 추가로 150mA를 전달하는 것은 바람직하지 않습니다. 이 경우 추가로 5V 전원 공급 장치를 사용해야 합니다. 본 실시예에서는 휴대폰 충전기의 스위칭 전원을 사용하였다. 마진을 고려하여 5V의 전압과 약 250mA의 전류를 제공할 수 있다면 조정되지 않은 모든 전원을 사용할 수 있습니다. 다른 전압을 사용할 수도 있지만 이 경우 적절한 공급 전압의 릴레이를 사용해야 합니다.신호 소스를 릴레이 및 전원 공급 장치와 일치시키려면 다음 유형의 트랜지스터 스위치를 설치해야 합니다.

선택된 트랜지스터는 임의의 문자와 1kOhm의 저항, 다이오드 - KD522가 있는 유형 KT815입니다. 이 연결 방식을 사용하면 전류 소비량이 4mA로 랩톱에서는 그다지 중요하지 않습니다. LED1과 LED2는 회로의 상태를 나타냅니다. 원하는 경우 저항과 함께 회로에서 제외할 수 있습니다.

220V 제어 장치는 소켓 하우징(네트워크 필터)의 여유 공간에 조립됩니다.회로도 파일 계획위치한

P. VYSOCHANSKY, Rybnitsa, 트란스니스트리아, 몰도바

다양한 장치를 위한 컴퓨터 제어 장치가 있으며 그 다이어그램은 그림 1에 나와 있습니다. 1은 기능적으로 설명된 것과 유사하지만 현재 각 포트에 있는 (COM 포트와 달리) 컴퓨터의 USB 포트에 연결됩니다. 장치의 유일한 칩은 일반적인 ATmega8 마이크로 컨트롤러입니다. USB 버스를 통한 통신을 구성하는 데 필요합니다. 전용 하드웨어 모듈은 없지만 이 기능은 소프트웨어로 수행된다.

전원 공급 장치의 양극 단자와 USB D-버스 라인 사이에 연결된 저항 R1은 이를 1.5Mbit/s의 교환 속도로 저속 LS 모드로 전환하여 소프트웨어에서 컴퓨터 메시지를 해독할 수 있습니다. 저항 R4 및 R5는 정보 교환 중에 발생하는 과도 현상을 제거하여 작동 안정성을 높입니다. 커패시터 C1은 전원 회로의 임펄스 노이즈를 차단하여 장치의 안정성도 향상시킵니다. 다이오드 VD1 및 VD2는 마이크로컨트롤러 공급 전압을 약 3.6V로 낮추는 역할을 합니다. 이는 USB 버스와 레벨을 일치시키는 데 필요합니다. 장치 제어 신호는 마이크로 컨트롤러의 RVO-RV5 및 RSO, PC1 출력에서 ​​생성됩니다. 높은 논리 레벨 - 전압은 약 3.4V입니다. 낮은 레벨 전압은 0에 가깝습니다. 각 출력에서 ​​10mA 이하의 전류를 소비하는 출력에 장치를 연결할 수 있습니다. 큰 전류 또는 전압 값이 필요한 경우 그림 1에 표시된 매칭 노드가 필요합니다. 5와 6.

장치는 브레드보드에 조립되었으며 인쇄 회로 기판은 개발되지 않았습니다. MLT 저항기가 사용되며 커패시터 C2 및 SZ는 고주파 세라믹 커패시터이고 C1은 K50-35 또는 이와 유사한 수입품입니다. 약 0.7V의 접합부 전압 강하를 갖는 실리콘 다이오드.

마이크로 컨트롤러용 프로그램은 Bascom-AVR 환경 버전 1.12.0.0에서 개발되었습니다. USB 버스를 사용하려면 USB 신호의 소프트웨어 디코딩을 실시간으로 수행하는 swusb.LBX 라이브러리가 사용됩니다. HEX 확장자를 가진 파일의 결과 프로그램 코드는 마이크로 컨트롤러의 FLASH 메모리에 로드되어야 합니다. 이를 위해 프로그래머는 Bascom-AVR에 내장된 유틸리티와 함께 ​​사용되었습니다. 마이크로컨트롤러 구성 비트의 상태는 그림 1에 표시된 상태와 일치해야 합니다. 2.

장치를 컴퓨터에 처음 연결하면 운영 체제는 "uniUSB"라는 새로운 USB HID 호환 장치를 감지하고 필요한 드라이버를 설치합니다. 몇 초 후에 장치가 구성되고 사용할 준비가 됩니다. 이를 사용하기 위해 UniUSB 프로그램이 만들어졌습니다. Windows 제품군의 32비트(x86) 및 64비트(x64) 운영 체제의 두 가지 버전으로 제공됩니다. 32비트 버전은 Windows 98, Windows XP 및 Windows 7 운영 체제에서 테스트되었으며, 64비트 버전은 Windows XPx64에서만 테스트되었습니다.

UniUSB 프로그램은 USB HID 장치 작업을 지원하는 사용자 정의 함수의 HIDJJb 라이브러리를 사용하여 PureBasic 언어(버전 4.31)로 작성되었습니다. 프로그램 창의 모습은 그림 1에 나와 있습니다. 삼.

실행 파일과 동일한 폴더에 UniUSB_KOfl.txt 또는 UniCOM_KOfl.txt라는 파일이 있어야 합니다. 마지막 옵션은 에서 제안된 UniCOM 프로그램과의 호환성을 위해 필요합니다. 이 파일에는 외부 장치를 제어하기 위한 스크립트가 저장됩니다. 프로그램이 시작되면 파일의 데이터가 메인 창에 있는 테이블에 로드되고, 작업이 완료되면 파일에 저장됩니다. 테이블 셀을 마우스 왼쪽 버튼으로 클릭하면 해당 상태를 변경할 수 있습니다. 1 - 높은 논리 레벨, 0 또는 비어 있음 - 낮은 논리 레벨.

테이블 열을 추가하거나 삭제하려면 해당 열을 마우스 오른쪽 버튼으로 클릭하고 나타나는 메뉴에서 필요한 작업을 선택해야 합니다.

장치를 USB 포트에 연결하면 프로그램이 장치를 감지하고 도구 모음 창 상단에 있는 > 버튼을 활성화합니다. 이 버튼을 클릭하면 테이블 열을 정렬하고 해당 열에 표시된 출력 상태를 설정하는 프로세스가 시작됩니다. 명확성을 높이기 위해 표 왼쪽에는 현재 로직 레벨이 높게 설정된 출력 수가 강조 표시되어 있습니다. 검색 속도(열에서 열로 전환하는 시간(밀리초))은 "속도, ms" 필드에서 설정됩니다.

Windows 운영 체제는 멀티태스킹이라는 점에 유의하세요! 이는 프로세서 시간이 여러 프로세스로 나누어지고 때로는 사용자에게 숨겨지며 시스템에 설정된 우선순위를 고려하여 차례로 실행된다는 것을 의미합니다. 따라서 100ms 미만의 시간 간격을 유지하는 데 큰 정확성을 기 대해서는 안 됩니다.

열 스크롤을 잠시 중지하려면 JB 버튼을 사용하세요. 다시 누르면 중단된 부분부터 검색이 계속됩니다. ■ 버튼을 누르면 테이블 열 검색이 완전히 중지됩니다. 컴퓨터와 장치 간의 정보 교환이 실패하거나 장치가 컴퓨터의 USB 커넥터에서 분리된 경우 프로그램은 상태 표시줄에 해당 메시지를 표시하여 오류를 보고합니다.

이 기사에서는 집에서 만든 장치를 연결하는 방법에 대한 단계별 지침을 제공하려고 시도합니다. USB HID마이크로컨트롤러에서 AVR그리고 운영체제가 설치된 컴퓨터 윈도우 7 x64마이크로 컨트롤러 포트를 통신하고 제어합니다. 예제 애플리케이션은 USB를 통해 마이크로컨트롤러 포트의 핀을 제어합니다(표시기 LED가 연결되어 있음). LED의 상태(꺼짐 또는 켜짐)도 읽을 수 있습니다. 이 주제는 초보자를 대상으로 하므로 프로그래밍 전문가에게 큰 요청이 있습니다. 썩은 계란과 썩은 토마토에 대한 아이러니한 의견은 좀 더 편리한 상황을 위해 저장해 두시기 바랍니다.

사용된 소프트웨어

1 . 마이크로컨트롤러의 경우 - Objective Development의 V-USB 라이브러리 및 Atmel의 IDE Atmel Studio 6. 또한 마이크로컨트롤러 펌웨어를 컴파일하려면 WinAVR 도구 체인을 다운로드하고 설치해야 합니다(전문가의 경우 Atmel Studio에 포함된 도구 체인을 사용할 수 있으므로 이것이 필요하지 않습니다).
2 . Windows 프로그램(호스트 소프트웨어)을 작성하기 위해 Travis Robinson의 LibUsbDotNet 라이브러리와 Microsoft의 Visual Studio C# 2010 IDE가 사용되었습니다.

제한된 기간 동안 Visual Studio C# 2010 Express를 무료로 사용할 수 있지만 Visual Studio 2010을 제외한 모든 소프트웨어는 무료입니다. 모든 작업은 Windows 7 x64 운영 체제 환경에서 수행되었지만 Windows 제품군의 다른 운영 체제(Windows XP 이상)도 마찬가지일 것입니다.

사용된 철

V-USB 라이브러리 덕분에 모든 AVR 마이크로컨트롤러를 사용하여 USB HID 장치를 만들 수 있습니다. 납땜 인두 사용에 익숙하다면 게시된 다이어그램 중 하나를 사용하여 USB 연결을 직접 조립할 수도 있습니다. 이러한 회로(V-USB 패키지에서 가져온)가 그림에 예로 표시되어 있습니다.

시간과 노력을 절약하려면 기성품 브레드보드를 ​​사용하는 것이 좋습니다. USB 부트로더가 보드에 기록되면 특히 편리합니다. 그러면 보드를 플래시하기 위해 프로그래머를 구입할 필요가 없습니다. ATmega32A 마이크로컨트롤러와 함께 AVR-USB-MEGA16 개발 보드를 사용했는데, 여기에는 부트로더(USBasp 프로그래머의 동작을 에뮬레이트하는 USBasploader)가 있습니다. 스카프의 전체 크기는 다음과 같습니다.

또한 메타보드(ATmega168 또는 ATmega328 포함)를 사용하거나 ATmega8 마이크로컨트롤러의 프로그래머를 사용할 수도 있습니다. 이러한 땀샘은 다음에서 저렴하게 구입할 수 있습니다. ebay.com또는 dx.com.

Atmel Studio 6 및 V-USB 라이브러리를 사용하여 마이크로컨트롤러 펌웨어 생성

Atmel Studio 6(이하 간단히 AS6)에서 새 프로젝트를 만듭니다. AS6에서 마이크로컨트롤러를 선택하라는 메시지가 표시되면 Atmega32편지도 없이 , Atmega32A가 아님(보드에는 Atmega32A) - WinAVR 툴체인은 차이점을 인식하지 못하고 Atmega32만 알고 있기 때문에 이것이 중요합니다. 이러한 마이크로 컨트롤러는 내부 설계가 동일하므로 우리에게는 차이가 없지만 AS6에는 차이가 있습니다.

이제 컴파일러를 올바르게 구성해야 합니다. AS6의 상단 메뉴에서 도구, 더 나아가 옵션..그러면 다음 창이 나타납니다:

왼쪽 목록에서 다음을 선택하세요. 툴체인. 오른쪽에 맛 목록이 나타납니다. 이 단어를 사용하여 Atmel은 사용된 도구(툴체인)에 대해 가능한 옵션을 인코딩했습니다.

메모. 목록에는 기본(Default)으로 사용되는 기본 도구 모음이 이미 포함되어 있습니다. 네이티브 툴체인은 마이크로 컨트롤러용 소스 코드를 컴파일하는 데 필요한 환경을 제공하는 헤더 및 라이브러리와 함께 GCC 컴파일러입니다. 이 툴체인은 Atmel에서 제공되며 AS6 설치와 함께 자동으로 설치됩니다. 이미 언급했듯이 이 툴체인을 사용하여 컴파일할 수 있지만 V-USB 예제의 소스 코드를 수동으로 수정해야 합니다(USB HID 예제를 기반으로 USB 장치가 작동함). 간단하지만 초보자의 경우 여기에 WinAVR 툴체인을 추가하고 컴파일에 사용하는 것이 더 좋습니다.
WinAVR 툴체인을 플레이버 목록에 추가하려면 버튼을 클릭하세요. 풍미를 더하다, 다음 창이 나타납니다:

이 창의 윗줄에는 WinAVR 컴파일러의 이름(임의)을 입력하고, 아랫줄에는 툴체인 컴파일러 자체가 설치된 전체 경로(\bin 폴더를 나타냄)를 입력한 후 버튼을 클릭합니다. 추가하다. 스크린샷에 표시된 대로 추가된 컴파일러가 맛 목록에 나타납니다.

새로 추가된 WinAVR 컴파일러를 마우스로 선택하고 버튼을 클릭하세요. 기본값으로 설정(기본 도구로 지정) 확인을 클릭합니다. 이 절차 후에 AS6은 WinAVR 컴파일러를 사용합니다.

이를 위해 프로젝트의 속성을 구성할 차례입니다. 솔루션 탐색기에서 커서를 사용하여 프로젝트 이름을 마우스 왼쪽 버튼으로 클릭하고 Alt+F7(메뉴 프로젝트 -> 속성) 설정 창이 나타납니다.

다음 설정을 수행하십시오.

  • 장에서 AVR/GNU C 컴파일러 -> 기호필드에 추가 -디F_CPU=12000000UL- 이는 12MHz의 마이크로컨트롤러 주파수에 해당합니다(이 석영은 내 AVR-USB-MEGA16 개발 보드에 설치되어 있습니다).
  • 장에서 AVR/GNU 어셈블러 -> 일반현장에서 어셈블러 플래그추가해야합니다 -DF_CPU=12000000UL.
  • 장에서 AVR/GNU C 컴파일러 -> 최적화현장에서 최적화 수준서 있어야 한다 크기에 맞게 최적화(-Os).
다음은 매우 중요한 점입니다. 창 왼쪽에 있는 목록에서 섹션을 선택하세요. 고급의, 아래 그림과 같습니다.

드롭다운 목록에서 툴체인 맛 AS6가 프로젝트를 컴파일할 때 사용하도록 추가된 WinAVR 컴파일러를 선택합니다. 이것으로 AS6 설정이 완료됩니다.

다음으로, 생성된 프로젝트에 프로젝트 소스 코드 파일을 추가해야 합니다. 펌웨어\VUSB 폴더, VUSB.c, usbdrv.c, usbdrvasm.S 및odebug.c 파일을 참조하세요. ASS6 프로젝트는 원래 명령줄에서 make 유틸리티를 사용하여 컴파일된 V-USB 라이브러리 예제 중 하나인 hid-custom-rq를 기반으로 합니다. V-USB 라이브러리를 기반으로 하는 다른 많은 코드 예제를 찾을 수 있습니다. 대부분 USB HID 장치(마우스, 키보드, 입력 및 출력 장치)이지만 USB CDC(가상 COM 포트) 장치도 있습니다. 프로젝트를 직접 생성하기에는 너무 게으른 경우 AS6에서 VUSB.atsln 프로젝트 파일을 열면 필요한 모든 설정이 이미 지정되어 있고 필요한 모든 파일이 추가되었습니다.

다른 개발 보드를 사용하는 경우 파일을 올바르게 구성해야 합니다. usbconfig.h. 이것은 V-USB 라이브러리의 구성 파일이며 많은 설정과 매개변수(VID, PID, 마이크로컨트롤러 핀, 설명자 값 및 기타 설정)가 지정되어 있습니다. 모든 설정에 대한 자세한 설명은 이 파일의 주석에 나와 있습니다. USD D+ 및 D- 신호(매크로 정의 USB_CFG_IOPORTNAME, USB_CFG_DMINUS_BIT, USB_CFG_DPLUS_BIT)에 사용되는 마이크로컨트롤러 핀 할당에 주의를 기울여야 하며, 이러한 핀에는 특별한 요구 사항이 적용됩니다. 구성 파일 usbconfig.h아카이브의 AVR-USB-MEGA16 개발 보드의 다리를 라우팅하도록 설계되었으며 작동이 보장됩니다. 프로그램은 이미 브레드보드에 있고 포트 B의 핀 0에 연결된 LED를 깜박입니다.

컴퓨터 프로그램(호스트 소프트웨어) 작성

우리 프로그램은 마이크로컨트롤러를 제어할 USB 연결을 통해 패킷을 보내야 합니다.

메모. 이 프로그램은 동일한 V-USB 라이브러리의 예제 콘솔 애플리케이션을 기반으로 만들어졌습니다. 콘솔 애플리케이션의 소스 코드는 makefile과 MinGW 패키지를 사용하여 컴파일되었으며 LibUSB 라이브러리를 사용했습니다. 이 예에서는 Visual Studio 그래픽 환경과 LibUsbDotNet 라이브러리를 사용합니다. 그러나 LibUsbDotNet 사용의 주요 이점은 이제 콘솔뿐만 아니라 그래픽 응용 프로그램도 쉽고 편리하게 만들 수 있다는 것이 아닙니다. 가장 큰 장점은 LibUSB 라이브러리가 수년 동안 가지고 다녔던 필터 드라이버가 이제 필요하지 않다는 것입니다. 탱크에 있는 경우 필터 드라이버는 Windows 플랫폼의 USB 장치와 데이터를 교환하는 LibUSB 라이브러리의 특수 소프트웨어 추가 기능입니다. 이제 이 격세주의는 필요하지 않습니다.
Microsoft Visual C# 2010 Express를 실행하고 새 Windows Form 프로젝트를 만듭니다. 이제 라이브러리를 프로젝트에 연결해야 합니다. LibUsbDotNet.dll. 솔루션 탐색기에서 프로젝트 이름을 마우스 오른쪽 버튼으로 클릭하고 "참조 추가"를 선택합니다.

또 다른 창이 나타납니다

여기에서 LinUsbDotNet.dll 라이브러리가 있는 디스크의 경로를 찾아야 합니다(기본적으로 C:\Program Files\LibUsbDotNet 폴더에 설치되지만 DLL 파일의 복사본을 프로젝트의 작업 디렉터리. 라이브러리를 연결한 후 프로젝트에서 이를 선언해야 합니다. 이를 위해 프로그램의 기본 모듈(Form1.cs 파일)에 다음 줄을 추가합니다.

LibUsbDotNet 사용; LibUsbDotNet.Info 사용; LibUsbDotNet.Main 사용;
시각적 양식 편집기로 이동하여 다음과 같이 보이게 만듭니다(버튼 3개와 라벨 3개 추가).

양식 로드 이벤트 핸들러를 만듭니다. 프로그램이 시작될 때 LibUsbDotNet 클래스의 인스턴스가 초기화되고 이를 통해 USB 장치와의 교환이 수행되도록 하기 위해 필요합니다. 여러 USB HID 장치를 컴퓨터에 연결할 수 있고 각 장치에 별도로 액세스할 수 있어야 하기 때문에 교환을 시작하기 전에 장치에 대한 액세스를 열어야 합니다. USB 장치를 식별하기 위해 모든 USB 장치에는 VID와 PID라는 특수 식별자가 있습니다.

메모. 때로는 동일한 VID 및 PID를 가진 여러 USB 장치가 컴퓨터에 연결된 경우 장치를 식별하기 위해 고유 일련 번호 또는 별도의 텍스트 설명자가 추가로 사용되지만 우리의 경우는 그렇지 않습니다. 일반적으로 컴퓨터에 연결된 각 USB 장치에는 다른 장치와 다른 고유한 VID/PID 쌍이 있으므로 올바른 장치를 찾고 액세스하는 것은 문제가 되지 않습니다.
VID는 공급업체 ID이고 PID는 제품 ID입니다. USB 장치의 VID: 0x 16C0, PID: 0x 05DF, 이 값은 구성 파일에 지정됩니다 usbconfig.h(이 파일은 이미 언급했습니다) AS6 마이크로컨트롤러 프로젝트의 파일입니다. 호스트 소프트웨어가 USB 장치에 구체적으로 액세스하려면 파일에 지정된 것과 동일한 매개변수 VID: 0x16c0, PID: 0x05df를 사용하여 MyUsbFinder 개체를 초기화해야 합니다. usbconfig.h. 이렇게 하려면 Form1 클래스의 전역 변수 정의 영역에 다음 코드를 추가합니다.

공용 정적 UsbDevice MyUsbDevice; public static UsbDeviceFinder MyUsbFinder = new UsbDeviceFinder(0x16c0, 0x05df);
작업할 USB 장치를 결정한 후에는 해당 장치에 연결할 수 있으며 프로그램이 시작되는 순간(양식 창 열기) 이 작업을 수행하는 것이 편리합니다. 이렇게 하려면 프로그램의 기본 양식을 선택하고 속성 편집기에서 로드 이벤트 핸들러 Form1_Load를 만듭니다. 핸들러 본문에 다음 코드를 입력합니다.

Private void Form1_Load(개체 발신자, EventArgs e) ( MyUsbDevice = UsbDevice.OpenUsbDevice(MyUsbFinder); if (MyUsbDevice != null) ( label2.Text = "연결됨!"; ) else label2.Text = "찾을 수 없음!"; )
버튼 Button1("On")에 대한 클릭 이벤트 핸들러를 만듭니다. 이렇게 하려면 비주얼 편집기에서 버튼을 두 번 클릭하고 이벤트 핸들러 본문에 코드를 추가합니다.

Private void Button1_Click(object sender, EventArgs e) ( // AVR-USB-MEGA16 개발 보드의 LED를 켜는 패킷을 보냅니다. UsbSetupPacket packet = new UsbSetupPacket((byte)(UsbCtrlFlags.RequestType_Vendor | UsbCtrlFlags.Recipient_Device | UsbCtrlFlags .Direction_Out) , 1, (short)1, 0, 0); 바이트 데이터 = 새 바이트 ControlTransfer(ref packet, data, 0, out countIn);
"끄기" 버튼 핸들러에 대해 다음 코드를 추가합니다.

Private void Button3_Click(object sender, EventArgs e) ( // AVR-USB-MEGA16 개발 보드의 LED를 끄는 패킷을 보냅니다. UsbSetupPacket packet = new UsbSetupPacket((byte)(UsbCtrlFlags.RequestType_Vendor | UsbCtrlFlags.Recipient_Device | UsbCtrlFlags.Direction_Out) ) , 1, (short)0, 0, 0); 바이트 데이터 = 새 바이트 ControlTransfer(ref packet, data, 0, out countIn);
읽기 버튼을 처리하는 코드:

Private void 버튼2_Click(객체 전송자, EventArgs e) ( //AVR-USB-MEGA16 개발 보드에서 데이터 수신 - LED 상태. UsbSetupPacket 패킷 = new UsbSetupPacket((byte)(UsbCtrlFlags.RequestType_Vendor | UsbCtrlFlags.Recipient_Device | UsbCtrlFlags.Direction_In) , 2, (short)0, (short)0); int countIn; byte data = new byte; if (MyUsbDevice.ControlTransfer(ref packet, data, 1, out countIn) && (countIn == 1) ) ( label3. Text = "값 읽기" + data.ToString() ) )
양식 닫기 이벤트 핸들러(프로그램 종료)는 LED가 켜져 있으면 LED를 끕니다.

Private void Form1_FormClosed(개체 발신자, FormClosedEventArgs e) ( UsbSetupPacket 패킷 = new UsbSetupPacket((바이트)(UsbCtrlFlags.RequestType_Vendor | UsbCtrlFlags.Recipient_Device | UsbCtrlFlags.Direction_Out), 1, (짧은)0, 0, 0); t countIn; 데이터 = 새 바이트; MyUsbDevice.ControlTransfer(참조 패킷, 데이터, 0, 출력 countIn)

마이크로컨트롤러 펌웨어에서 USB 패킷을 디코딩하는 방법

마이크로 컨트롤러 측의 데이터 수신 및 처리는 다음 기능에서 수행됩니다. usb기능 설정(펌웨어 AS6 프로젝트의 메인 모듈 VUSB.c에 위치) 이 기능은 다음과 같습니다.

UsbMsgLen_t usbFunctionSetup(uchar data) ( usbRequest_t *rq = (void *)data; if((rq->bmRequestType & USBRQ_TYPE_MASK) == USBRQ_TYPE_VENDOR)( DBG1(0x50, &rq->bRequest, 1); /* 디버그 출력: 인쇄 요청 */ if(rq->bRequest == CUSTOM_RQ_SET_STATUS)( if(rq->wValue.bytes & 1)( /* LED 설정 */ LED_PORT_OUTPUT |= _BV(LED_BIT); )else( /* LED 지우기 */ LED_PORT_OUTPUT &= ~_BV(LED_BIT); ) )else if(rq->bRequest == CUSTOM_RQ_GET_STATUS)( static uchar dataBuffer; /* usbFunctionSetup을 종료할 때 버퍼는 유효한 상태로 유지되어야 합니다 */ dataBuffer = ((LED_PORT_OUTPUT & _BV(LED_BIT)) ! = 0); usbMsgPtr = dataBuffer; /* 반환할 데이터를 드라이버에 알려줍니다. */ return 1; /* 드라이버에 1바이트를 보내라고 지시합니다. */ ) )else( /* USBRQ_HID_GET_REPORT 및 USBRQ_HID_SET_REPORT 요청은 구현되지 않습니다. * 우리는 이를 호출하지 않기 때문에 운영 체제도 이에 액세스하지 않습니다. * 핸들이 어떤 값도 정의하지 않기 때문입니다. */ ) return 0 /* 해결되지 않은 요청에 대한 기본값: 호스트에 데이터를 반환하지 않음 */ )
USB HID 장치는 간단하며 기본 제어 끝점 0을 통과하는 제어 전송에만 응답합니다. 데이터 전송 방향은 요청 유형(필드 bRequest)에 따라 디코딩됩니다. CUSTOM_RQ_SET_STATUS인 경우 이는 마이크로컨트롤러용 데이터입니다. 데이터가 디코딩되고 마이크로컨트롤러는 여기에 포함된 명령을 실행합니다. 이 경우 맨 처음 수신된 데이터 바이트에서 LED 상태가 인코딩됩니다. 즉, 최하위 비트에 1이 있으면 LED가 켜지고 0이면 꺼집니다. bRequest 필드가 CUSTOM_RQ_GET_STATUS 값을 수락하면 그에 대한 응답으로 버퍼가 LED의 현재 상태로 채워지고 버퍼 데이터가 호스트로 다시 전송됩니다. 모든 것이 매우 간단하며 원하는 경우 필요에 맞게 코드 동작을 쉽게 수정할 수 있습니다.

작동 방법에 대한 비디오:

댓글을 통해 질문과 건설적인 의견에 기꺼이 답변해 드리겠습니다.



질문이 있으신가요?

오타 신고

편집자에게 전송될 텍스트: