제조공정
| × | 1 |
명령줄
센서의 값을 찾아야 하거나 로봇에게 "왼쪽으로 이동"과 같은 작업을 수행하도록 지시하려는 경우가 있습니다. 프로그램에 변수의 런타임 값을 요청하거나 디지털 전위차계의 값을 설정해야 할 수도 있습니다.
필요한 것은 명령줄입니다. 예, Arduino가 텍스트 명령에 응답하도록 하는 것은 쉽습니다.
여기에 구축할 수 있는 항목이 있습니다. 간단하고 빠르며 메모리 효율성이 매우 높은 명령줄 인터페이스 (CLI)를 사용하여 몇 분 안에 잘라서 자신의 코드에 붙여넣고 실행할 수 있습니다. 명령은 이름과 여러 인수로 구성됩니다. 명령을 입력할 때 백스페이스도 지원합니다.
빠른 개요
모든 스케치에는 loop()
가 있습니다. 기능. 다음과 같이 간단할 수 있습니다. CommandLine.h
라는 별도의 탭에서 두 개의 루틴을 호출합니다. . 이 두 파일을 통해 안내해 드리겠습니다. 그러면 바로 사용할 수 있습니다.
루프
기능: 매번 loop()
실행하여 직렬 포트에서 명령이 있는지 확인하고 getCommandLineFromSerialPort()
를 호출합니다. . CommandLine
변수 CommandLine.h
에 선언되어 있습니다. 하지만 스타일적으로는 메인 루프 탭으로 옮기고 싶을 수도 있습니다. 전체 명령이 직렬 포트에 도착하고 명령 버퍼에 복사된 경우:
char commandLine[COMMAND_BUFFER_LENGTH + 1];
그런 다음 loop()
DoMyCommand()
호출 적절한 명령을 실행합니다.
이제 CommandLine.h
에 무엇이 있는지 살펴보겠습니다. . 모든 코드를 CommandLine.h
에 넣었음을 지적해야 합니다. , 왜냐하면 이 코드를 잘라내어 Arduino IDE의 새 탭에 붙여넣기만 하면 되기 때문입니다(탭에 ".h
로 끝나는 이름을 지정해야 합니다. "). 그런 다음 이 파일을 기본 파일, 즉
#include "CommandLine.h"
이렇게 하면 모든 명령줄 코드를 하나의 탭에 넣고 추가 코드 없이 프로그램의 다른 곳에서 해당 루틴을 참조할 수 있습니다.
CommandLine.h에서 보기
CommandLine.h
파일 이 게시물의 끝에 포함되어 있습니다. CommandLine.h
내 , 수정해야 하는 각 줄은 //Modify here
주석으로 표시됩니다. . 파일에는 두 개의 샘플 명령 add
이 포함되어 있습니다. 및 하위
DoMyCommand
내에서 어떻게 호출되는지 보여줍니다. .
많은 분들이 필요로 하는 전부입니다. CommandLine.h
를 살펴보세요. . 좀 더 자세히 보고 싶은 분들은 계속 읽어주세요.
자세히 보기
CommandLine.h
내 먼저
를 포함합니다. . 문자열.h
C 표준 라이브러리입니다. . C 라이브러리를 접해본 적이 없다면 "C 프로그래밍 언어"에 대한 빠른 인터넷 검색을 수행하십시오. C 성경은 몇 년 전에 Brian Kernigan과 Dennis Ritchie에 의해 작성되었으며 최신 상태로 유지되었습니다. 대부분의 사람들이 사본을 소유하고 있지만 온라인에서 무료로 찾을 수 있습니다.
strtok()
만 사용합니다.
의 루틴(문자열에서 토큰으로) . 이 루틴은 토큰, 즉 특정 문자로 구분된 단어(strtok
의 두 번째 매개변수)를 읽습니다. ). 이렇게 작동합니다.
ptr
문자열을 전달합니다. 첫 번째 토큰을 반환합니다.ptr
대신 NULL을 전달합니다. 초기 문자열에서 중단된 위치에서 계속되므로 한 번에 하나의 토큰(대략 단어)을 얻습니다.
도 포함됩니다. 여기서 atoi()
만 사용합니다. ASCII에서 정수로의 변환을 위해. 걱정하지 마십시오. 컴파일러는 전체 라이브러리가 아닌 이 하나의 루틴만 포함하지만 유용하므로 이 라이브러리의 다른 루틴을 확인하는 것이 좋습니다.
다음은 내가 작성한 print2:
라는 작은 선택적 매크로입니다.
#define print2(x,y) (Serial.print(x), Serial.println(y)
나는 항상 레이블과 문자열을 인쇄하고 싶습니다. 다음과 같이 사용합니다.
print2("myVar =", myVar);
myVar가 25이면 직렬 창에 인쇄됩니다.
myVar =25
CommandLine.h
getCommandLineFromSerialPort()
포함 직렬 포트에서 명령줄을 어셈블합니다. 호출될 때마다 직렬 포트에서 읽고 입력을 전역 입력 버퍼인 CommandLine[]
에 저장합니다. . return
에 도달하면 true
를 반환하는 명령의 끝을 나타내는 문자 .
완전히 어셈블된 버퍼는 이제 DoMyCommand()
에 전달됩니다. 사용자가 요청한 기능을 파악하고 호출합니다. 많은 수의 명령을 사용하면 상당히 다루기 힘든 if-the-else 문을 얻을 수 있습니다.
정말 엄청난 수의 명령이 있는 경우 해싱 기능을 채택하는 것과 같이 속도를 높일 수 있는 방법이 많이 있습니다. 또는 명령을 한 문자로만 만든 다음 해당 문자를 switch-case 문의 레이블로 사용할 수 있습니다. 나는 이것들 중 어느 것도 매우 자주 필요하지 않다는 것을 발견합니다. 단어는 단일 문자보다 훨씬 기억하기 쉽고 이것이 Arduino라는 점을 감안할 때 칩의 공간이 다 떨어지기 전에 실제로 얼마나 많은 명령을 가질 수 있습니까?
추가 및 하위
각 명령 함수는 자체 인수를 구문 분석할 책임이 있습니다. 이것은 그것을 수행하는 간단한 방법이며 쉽게 수정할 수 있습니다. 이에 대한 대안은 DoMyCommand
에서 모든 인수를 즉시 읽는 것입니다. . 개별 인수를 문자열 argv[]
의 전역 배열에 넣을 수 있습니다. .
이 예제의 목적을 위해 두 개의 명령을 정의했습니다. add
및 하위
. 둘 다 숫자 인수를 사용하지만 readWord
를 포함했습니다. (readStringToken
이라고 부를 수 있습니다. ) 단어를 반환합니다. 이 readStringToken
을 수정할 수도 있습니다. "이것은 문자열입니다
와 같은 문자열을 허용합니다. ". 독자에게 맡겨진 연습이라고 생각하세요.
가장 빠르게 달리는 방법
위와 같은 메인 루프 파일이 있다면 아두이노 IDE 창 오른쪽에 아래쪽 삼각형을 이용하여 새 탭을 만들고 CommandLine.h
를 복사합니다. (아래) 파일에 add
를 입력할 수 있어야 합니다. 및 하위
명령.
이제 당신에게 달려 있습니다!
섹션> <섹션 클래스="섹션 컨테이너 섹션 축소 가능" id="코드">제조공정
구성품 및 소모품 Arduino UNO 모든 arduino.. 때로는 그뿐만 아니라 × 1 버튼(래칭 아님) 풀다운 저항 포함(1kohm 사용) × 1 저항 10k 옴 × 1 앱 및 온라인 서비스 Arduino IDE 이 프로젝트 정보 저는 재미있는 프로젝트를 진행 중이며 버튼을 누를 때마다 작동하는 Arduino 크로노미터가 필요했습니다. 복잡한 것은 아니지만 이 코드가 다른 사람들의 프로젝트에 유용할 것이라고 생각했습니다.
구성품 및 소모품 rda5807 fm 라디오 모듈 × 1 SparkFun Arduino Pro Mini 328 - 3.3V/8MHz × 1 노키아 5110 디스플레이 × 1 18650 리튬 이온 배터리 × 1 18650 배터리 케이스 × 1 Adafruit USB 리튬 이온 배터리 충전기 × 1 오디오 증폭기 × 1 포토 저항기 × 1 범용 트랜지스터 NPN × 1