반응형

안녕하세요~

최근, ATmega128 칩을 테스트할 일이 있어 AVRISP-mk2 툴을 알리에서 구해서 연결하던 중, AVRStudio 7.0에서 인식이 안 되는 문제가 생겨, zadig 툴을 사용하여, 펌웨어 업뎃을 진행했습니다. 

zadig-2.8.exe
5.01MB

참고로, Zadig 툴은 USB형태로 연결된 기기장치들의 펌웨어를 강제로 원하는 형태로(위 이미지에 있는 4가지 종류) 덮어  씌울 수 있는 툴로서 사용시 주의를 요합니다.  Zadig 툴의 옵션 메뉴에 있는 "List All Device"를 클릭하면, PC에 연결된 모든 USB장치가 목록으로 뜨게 되는데요,  AVRISP 장치의 펌웨어를 4종 모두 바꾸어가며 테스트하던 중(기기를 꽂고 빼고 하면서) 목록 최상단에 있던  키보드(Keychron K1)를 펌웨어 업뎃 시키고야 말았습니다. (살짝 뜨는 경고 메시지를 무시해 버림)


 그 덕에(?)  갑자기 키보드가 먹통이 되었는데요,   이를 해결하고자, Zadig 목록에 있던 4종의 펌웨어로는 모두 인식이 안 되고,  키보드 제조사 게시판에서 제공하는 펌웨어 업뎃 프로그램으로 복구를 시도해 봤지만,  펌웨어 업뎃으로 인해 키보드가 HID장치가 아닌 다른 장치로만 인식이 되는 상황이어서 제조사에서 제공되는 펌웨어 업뎃 툴로는 복구가 안 되는 상황이 발생하게 되었습니다.   

윈도 장치관리자에 있는 Keyboard 목록을 삭제하고 드라이버를 다시 설치해보려 했지만 제대로 인식이 되지 않았으며, 여러 가지 시도 끝에  겨우 해결을 했는데요,  모든 상황이 동일하진 않겠지만,  저와 같은 상황에 빠진다면, 참고해 보시라고 기록을 남겨 놓습니다.  

 우선 Zadig로  WinUSB (v6.1.7600...) 버전으로 펌웨어 업뎃을 해놓고서,  키보드를 다른 PC에 물리니 키보드의 기본 기능은 사용할 수 있는 것으로 확인되자,  인식이 안 된 PC에서 레지스트리 편집을 통해,  Keyboard 관련 Driver버를 모두 삭제하는 것이 필요하다고 생각되어 삭제를 하게 되었습니다. 
윈도 실행 메뉴 》 Regedit  엔터,    레지스트리 편집기로 들어가서,  아래 목록처럼 키보드 목록으로 들어가세요,  

아래에 보면, 그동안 인식된 키보드 관련 레지스트리 값들이 보이는데요, 인식이 안 된 키보드 항목이 어떤 것인지 모르기 때문에, (기본값) 항목을 제외하고 모두 삭제시켜주세요.  (레지스트리 작업 시 주의하세요!)

HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\KeyboardClass

그리고, 재부팅한 후,  재일 중요한 부분! 입니다.

먹통이 된 키보드를 다시 연결하고, 제어판 장치관리자로 들어갑니다. 

그리고 문제가 된 키보드 장치(키보드 모델명) 혹은 USB장치로 인식된 키보드 항목을 찾아서 선택 후에 마우스 우클릭하고 장치속성 창을 여세요,  그리고 드라이버 탭의 드라이버 업데이트(P)를 클릭해서 아래와 같은 화면이 나오면,  → 내 컴퓨터에서 드라이버 찾아보기(R) 항목을 클릭하세요. 

그리고 이어지는 화면에서 아래처럼,  → 컴퓨터의 사용 가능한 드라이버 목록에서 직접 선택(L)을 클릭합니다. (문제 해결 전에는 여러 목록이 떴고,  다른 항목이 기본 선택되어 있는 상황이었습니다.)



 그러면, 
드라이버 업데이트 관련된 호환 가능한 하드웨어 장치 목록 몇 가지가 쭉... 뜰 텐데요,  그중에서 아래처럼, USB 입력 장치를 선택하고 다음을 클릭합니다. 

 

그리고 닫기를 누르면,   좀 전까지도 작동이 안 되었던 키보드가 작동하는 것을 볼 수 있을 겁니다.  (필요한 경우 재부팅)

 

그럼,  Zadig 같은 펌웨어 업뎃 툴을 사용하실 때 주의해서 사용하세요~  ^^;;

 

 

반응형
반응형

이번 게시글은 아래 지난 게시글 핵심노드 설명 3편에 이은 설명입니다.  아래 게시글 링크를 먼저 참고해 주세요.

【Node-RED #④】노드-레드! 핵심노드 설명 3편/ Core Node Description! #3

①  trigger 노드

 trigger 노드는 메시지를 일정한 규칙에 따라 전달할 수 있도록 해주는 노드인데요, 예를 들면, 메시지에 따라서 일정간격으로 메시지를 전송하도록 하거나, 특정 메시지를 수신하면 홀드 시키거나 하는 등 이벤트를 줄 수 있는 노드입니다.   또한 시스템에서 무한루프에 빠져 있는 경우와 같은 오류등을 감지해 줄 수 있는 와치독 타이머(Watchdog timer)와 같은 역할도 줄 수 있습니다.    정리하자면 노드 플로우에서 흐름을 멈추거나 다시 트리거 시켜주는 등 제어가 가능한 노드라고 볼 수 있습니다. 

그럼, 실습을 위해 아래처럼 노드를 구성해 주세요.

 

1) "타임스탬프" (인젝트) 노드의 설정화면입니다. 

 

2) "STOP" 인젝트 노드의 설정화면입니다.

 

3) "RESET" 인젝트 노드의 설정화면입니다.

 

4) "trigger"노드의 설정화면입니다. 

송신데이터에는 "1"을 적어 놓았는데요,  전달하고 싶은 특정 문자를 적거나하면 되고,  초기화 조건에 "stop"을 적어 놓았는데요,   "STOP" 인젝션을 누를 때 "STOP" 메시지가 전달되면 트리거를 멈추도록 하고 있습니다. 

그럼, 여기서 아래처럼 trigger노드의 속성을 수정해 주면, 3초 간격으로 송신데이터"1"을 반복 송신하게 됩니다. 

 

이때, STOP 인젝터를 클릭하게 되면, 아래처럼 trigger가 멈추게 되고 디버그 창으로도 더 이상 메시지가 전달되지 않게 됩니다.

여기서 기본 트리거 간격을 1초로 바꾸고,   2초 간격의 Trigger 타임스탬프를 하나 더 추가해 볼게요.   그래서 1초 간격으로 트리거 되는 상태에서 추가한 인젝터를 누르게 되면, 2초 간격으로 트리거 시킬 수도 있습니다. 

그리고, 각각의 속성을 아래처럼 입력하거나 수정해 주세요. 

실행해 보면,  처음 기본 "타임스탬프"를 클릭하면 trigger에 설정한 대로 1초 간격으로 "1"이라는 메시지가 디버그창으로 전달되다가, "Trigger 2 sec"인젝터를 클릭하는 순간 2초 간격으로 "1"메시지가 전달되는 것을 볼 수 있습니다. 

 

②  join 노드

 Join 노드는 수신된 메시지들을 지정된 규칙에 따라 하나의 메시지로 변환해 주는 기능 등을 수행합니다. 
우선 Join 노드의 기능알 알아보기에 앞서 직전 게시글에서 다루었던 Split 노드로 메시지를 분리해보고 나서, 여러 개의 메시지가 수신될 때 이를 합쳐서 출력해 보도록 하겠습니다. 

그럼, 아래처럼 Sprit 노드가 포함된 플로우를 구성해 주세요. 

타임스탬프 노드는 아래처럼 해주세요.

다음, Split 노드 속성창인데요,  아래 보시면 '분할 항목'에 아무것도 입력 되어 있지 않은 것처럼 보이지만, "공백 한 칸"이 입력되어 있습니다. 주의해 주세요.  만약 공백을 입력하지 않을 경우, 메시지는 Split 되지 않고 모두 이어져서 하나로 전달 됩니다.

그리고서 배포 후 타임스탬프를 클릭해서 실행하면 아래처럼, 한 줄의 메시지가 각각 분리된 것을 볼 수 있습니다. 

다음으로, 아래처럼, Join노드를 구성해 주시는데요, 다섯 개의 타임스탬프 입력을 Join 노드에 연결한 플로우를 구성해주세요,  각각의 타임스탬프에 있는 메시지를 합쳐서 디버그창으로 출력해 볼게요.

아래는, Data1의 세부 속성 모습인데요,  Data2~Data5의 속성도 동일한 형태로 설정해 주세요. 

다음으로, Join 노드의 속성을 아래와 같이 설정해 주세요.    동작부분에는 수동으로 해주시고, 출력 부분에는 문자열로 선택합니다.  다음으로 연결문자 항목에는 아무 입력도 없을 경우에는 메시지들이 모두 붙어서 출력되며, 공백, '콤머', '+' 기호 등등 메시지들을 결합하고자 하는 문자가 있을 경우 입력하면 됩니다.   그리고 "지정수의 메시지파트를 수신 후" 항목에 5를 입력하여, 5개의 타임스탬프 메시지가 입력되면 자동으로 출력되도록 설정을 하였습니다.   그리고  "첫 메시지수신후부터 타임아웃 후" 항목에 10을 입력하거나 하게 되면, 첫 메시지를 수신하고 10초가 지날 경우 자동으로 입력된 메시지가 출력되는 설정입니다. 

이제 무입력, 공백 한칸, 콤머, + , /  으로 연결문자를 각각 입력해서 결과를 보면 아래처럼 결합되어 출력되는 것을 볼 수 있습니다.  물론 타임스탬프 누르는 순서를 바꾸면 출력도 바뀐 순서대로 결합되어 나오게 됩니다. 

그럼, 다음으로 Join 노드의 속성 중에서 "출력"부분의 항목을 아래처럼 "배열"로 변경해서 실행해 보세요. 

이렇게 하고, 결과를 출력해 보면, 아래처럼 데이터가 배열 형태로 결합되어 저장되는 것을 확인할 수 있습니다. 

그리고 마지막으로, 아래 Join노드의 속성에서 "출력"항목의 선택을 "key/value오브젝트"로 선택해 볼게요. 
이렇게 할 경우 사용할 값 항목에 보면 "msg.topic"으로 되어 있는데요, 이에 따라, 타임스탬프(inject) 노드에 있는 msg.topic 항목에다가, 예를 들어, 숫자 키값을 1~5 각각 입력해 주면,  key/value 오브젝트로 인식되어 결합처리해 줄 수 있게 됩니다. 

그럼, 타임스탬프를 순서대로 클릭해서 출력을 확인해 보면 아래처럼, key/value 오브젝트 형태로 데이터가 결합 정리되어 출력되는 것을 확인할 수 있습니다. 

 

반응형
반응형

이번 게시글은 아래 지난 게시글 핵심노드 설명 2편에 이은 설명입니다.  아래 게시글 링크를 먼저 참고해 주세요.

【Node-RED #③】노드-레드! 핵심노드 설명 2편/ Core Node Description! #2

①  Status 노드

Status(상태) 노드는 플로우 내에 있는 특정 노드들의 상태 메시지를 수신하는 역할을 합니다.   노드의 상태를 표시해 주는 기존 기능을 통해서 상태가 변경될 때 Status 노드는 관찰을 하는데요, 특정 노드의 출력을 감지하여 메시지를 출력하는 경우 등에 활용할 수 있습니다. 

예시)  예를 들어 아래와 같은 플로우가 구성되어 있을 때, debug2로 메시지(숫자'2')가 전달 되는 상황에서 Debug2로 메시지가 전달되면 "status 노드"를 통해서 이를 확인하는 플로우를 구성할 수 있습니다.

[ 지난 게시글에 입력한 Function node의 코드 설정입니다 ]

var msg1 = { payload: "1" };
var msg2 = { payload: "2" };
var msg3 = { payload: "3" };

return [msg1, msg2, msg3];

우선, 위와 같이 노드 플로우를 구성하고, Status의 설정과 디버그 1, 2, 3, 4의 설정은 아래와 같이 해주세요. 

 

이렇게 설정 후 '배포하기'를 누르고 'Hello world!'노드의 인젝션을 실행시키면 아래처럼, debug4를 통해서 상태를 수신하게 됩니다. 

 

②  Comment 노드

comment 노드는 플로우에 영향을 미치지 않는 노드로써, 설명 또는 주석을 작성할 때 사용되는데요, 설명이 필요한 플로우 주변에 넣거나 플로우 구간끼리 구분을 위해 넣어 놓을 수 있습니다. 아래 예시를 참고해 보세요. 



③  Split 노드

Split노드는 입력으로 들어오는 데이터를 설정한 규칙으로 분리 시키는 작업을 수행할 수 있는 노드입니다. 
메시지 내용을 줄 단위(엔터) 혹은 ','컴머나  '.'마침표 등과 같은 특정 문자(스트링) 단위로 구분을 하거나, 노드에 입력되는 메모리 버퍼 단위로 분리 가공할 수 있습니다. 

그럼, 예시로 split노드를 이용해서 전달할 메시지를 줄바뀜이 날 때마다 분리해 볼게요. 

예시①-1) 줄바뀜 ("\n")이 일어날 때 분리해 주는 예시

우선 아래와 같이 노드를 구성해주세요.  "데이터 노드"는 "Template"노드를 이용하면 됩니다. 

아래는 데이터 노드와, split 노드의 속성창 설정 내용입니다. 

 

이렇게 하고서, 타임스템프(인젝션)을 클릭해 보면, 아래처럼 데이터의 줄 바뀜이 일어날 때마다 데이터가 분리(Split)되는 것을 볼 수 있습니다.


예시①-2) 위 예시에서 콤머 ', '  와  마침표 '. ' 등의 여러 가지 문자로도 구분을 할 수 있으니 참고해 주세요. 

 

예시①-3) 마침표 ', '  문자로 데이터를 분리한 예시.

 

예시 ②)  입력되는 문자 길이로 일괄적으로 분리하는 경우. (split 노드에서 아래처럼 분할 부분을 고정장(영문표기: Fixed length of)으로 변경하고 구분하고자 하는 단위의 숫자를 입력해 주세요,  여기서는 3개의 스트링으로 입력) 

템플릿(Template) 노드의 데이터 설정은 아래처럼 했습니다. 

그래서 결과를 출력해 보면 아래처럼 출력되는 것을 볼 수 있습니다. 

 

예시 ③)  배열 단위로 데이터를 분리(구분)할 수 있습니다.  템플릿 노드의 데이터와 속성을 아래처럼 수정해 주세요.  ( 데이터를 배열형태로 바꾸고, 출력 형식을 'JSON'으로 변경합니다.)

그리고 Split노드의 속성은 아래처럼 구분해 주세요.  먼저 2로 입력하여 배열의 값을 두 개씩 묶는 경우입니다. 

결과 출력을 보면 아래처럼 배열값이 2개씩 분리되어 출력되는 것을 볼 수 있습니다. 

그럼, 이어서 배열 묶음을 3으로 변경해서 출력해보면 아래처럼 결과를 정확하게 얻을 수 있습니다. 

 

예시 ④)   오브젝트의 경우는 파이썬의 딕셔너리 구조와 같은 Key값을 기준으로 데이터를 분리할 수 있도록 해줍니다. 
split노드의 속성을 아래처럼 변경해 주세요. 

이를 실행하면 아래처럼 Key값을 기준으로 데이터가 분리되어 출력되는 것을 확인할 수 있습니다. 

 

④  Sort 노드

sort 노드는 입력데이터를 규칙에 따라 정렬해 주는 노드인데요, 정렬은 전달된 msg.payload값이나 JSONata 식을 통해서 정렬할 수 있습니다.   정렬방식은 값을 기준으로 오름차순과 내림차순으로 정렬되며, 수치로서 도 오름차순과 내림차순으로 정렬 가능합니다. 

먼저 템플릿 노드의 데이터를 아래처럼 입력해 주세요. 

Sort노드는 아래처럼 입력하는데,  먼저 "수치로써 비교" 부분을 체크해제하고 결과를 출력해본 후, 체크 후 결과도 차례로 출력해 보세요. 

내림차순의 경우도 동일하게 활용할 수 있습니다. 

또한, Sort노드에서 키값을 Json 표현식으로하여 변경하면 딕셔너리 자료의 Value값을 기준으로도 정렬할 수 있습니다.   예를 들어,  이름과 나이 형태로 된 딕셔너리 데이터가 있을 때,  나이를 기준으로 오름차순이나 내림차순으로 정렬이 가능합니다.  
먼저 "Template"노드를 아래처럼 입력해 주세요. 

그리고,  Sort노드는 아래처럼 수정해 주세요. 

 

그리고 인젝트 버튼을 클릭하여 결과를 출력해보면 아래처럼 나이를 기준으로 오름차순으로 출력된 결과를 볼 수 있습니다. ( 데이터가 안 보일 경우 ▼array [3]  부분의 삼각형을 눌러 아래로 펼쳐보세요)

 

끝으로 Sort노드에서 내림차순으로 바꾸어 출력해 보면 아래처럼 잘 출력되는 것을 확인할 수 있습니다. 


그럼, 이번 시간은 여기까지하고, 다음 시간에 핵심노드 설명을 이어가도록 하겠습니다. 
감사합니다. 

 

반응형