2025년 7월 10일 목요일

Fritzing 가지고 놀기

(ChatGPT의 대답) Fritzing전자 회로 설계와 프로토타입 제작을 돕는 오픈 소스 소프트웨어입니다. 주로 전자 DIY, 아두이노 프로젝트, 메이커 교육 등에서 많이 활용됩니다.

아두이노 나노를 이용한 MIDI 컨트롤러를 만들기 위해 Fritzing을 다운로드하여 설치한 뒤 만능기판(perfboard)를 펼쳐놓고 연습을 하는 중이다. 흔히 무료라고 알려져 있으나 나는 최신 버전을 다운로드하기 위해 8 유로를 기부하였다. 

대충 만든 첫 작품. 아직 미완성이고 분기 처리도 엉망이다.

브레드보드를 기준으로 부품 배치 및 배선을 도와주는 프로그램으로 설계가 되어서 그런지 만능기판은 다루기가 제법 까다롭다. 부품 리드를 1:1로 잇는 것은 그런대로 잘 된다. 아니다, 그렇지만도 않다. 기판 위에 부품을 올린 뒤 마우스 포인터를 부품에 가져가면 닿는 위치에 따라서 부품이 하이라이트되는 방식이 몇 가지로 바뀐다. 부품 전체를 검정색 점선이 둘러싸기도 하고, 부품 전체가 어두워지기도 하며, 리드 끝점의 색깔이 최소한 두 가지로 바뀌기도 한다. 각 상태에 따라서 마우스 드래그의 동작이 달라지므로 아주 조심해야 한다. 위치 이동, 배선, 리드 길이 변경 등.

이것도 쉽지 않은데, 한 포인트에서 전기적 접속을 이루면서 여러 곳으로 분기하게 만드는 것이 어렵다. 원래 그렇다고 한다! 시각적으로 그렇게 보이도록 만들 수는 있지만, Frtizing 안에서는 실제 연결된 것으로 인식하지 않는다. 다음의 예를 보자. 

수직으로 뻗은 짧은 노란색 와이어의 위 아래 끝점이 주황색으로 표시되어 있다. 이는 실제 연결이 되지 않았음을 의미한다. 인쇄를 해서 회로를 실제로 꾸미는 데 가이드로 이용할 수는 있지만, 이런 상태로는 Fritzing 안에서 이를 회로도나 PCB로 전환하는 것은 곤란하다. ChatGPT에 의하면 부품('Core Parts') 중에서 solder point나 pad를 찾아서 이용하라고 한다. 말은 쉬운데 이런 부품이 목록에서 눈에 확 들어오는 것이 아니다. 약간 다른 모양의 것을 불러다 놓은 다음 핀 수를 줄인다든지 하는 방법을 택해야 하는 것 같다.

시작이 잘못되었다! 브레드보드에서 먼저 부품 배치와 와이어링을 마친 뒤, 회로도로 전환하여 점검한 다음에 만능기판으로 넘어가는 것이 더 합리적인 방법으로 보인다. Fritzing이 만들어진 근본 취지를 생각하면 이런 순서로 접근하는 것이 백번 옳다. 다음번 프로젝트에서는 이러한 권장 방법을 쓰도록 하고, 이번에는 만능기판으로 시작했으니 일단 끝을 보련다. 회로 점검은 오직 눈으로 하는 수밖에는...


2025년 7월 6일 일요일

[EZ Ardule MIDI controller] 마이크로SD카드에 담긴 MIDI 파일의 단순 재생부터 시작해 보다

시작은 무식(?)과의 싸움, 그리고 다음으로는 제한된 메모리와 싸움...

기본부터 공부하지 않은 상태로 챗GPT에게 물어 가면서 안일하게 자작을 해 나가려고 생각한 것이 잘못된 선택일지도 모른다. 알리익스프레스에서 주문한 OLEVO라는 브랜드의 32G 마이크로SD카드가 제대로 인식조차 되지 않으리라고 어떻게 생각할 수 있었겠는가. 

아두이노 우노에서 마이크로SD카드를 점검하고 있다.

무난한 SanDisk 제품을 사러 다이소에 다녀오는 길.

라이브러리에 딸린 유용한 예제는 무시한 채로 챗GPT에게 모든 것을 물어 보는 것도 옳지 않은 자세였다. 카드 인식이라든가 카드에 수록된 MIDI 파일을 재생하는 코드는 이미 라이브러리에 딸려 온 예제 코드로 충분하게 구현 가능하였다. 다음은 예제 코드를 이용하여 카드 인식을 테스트한 결과이다. 시리얼 모니터로 나온 출력을 복사하였다.

Initializing SD card...Wiring is correct and a card is present.

Card type:         SDHC
Clusters:          973584
Blocks x Cluster:  64
Total Blocks:      62309376

Volume type is:    FAT32
Volume size (KB):  31154688
Volume size (MB):  30424
Volume size (GB):  29.71

Initializing SD card...Wiring is correct and a card is present.

Card type:         SDHC
Clusters:          973584
Blocks x Cluster:  64
Total Blocks:      62309376

Volume type is:    FAT32
Volume size (KB):  31154688
Volume size (MB):  30424
Volume size (GB):  29.71
SYSTEM~1/     2025-07-06 12:23:42
  WPSETT~1.DAT  2025-07-06 12:23:42 12
  INDEXE~1      2025-07-06 12:23:44 76
PASSPORT.MID  2025-04-13 15:58:20 23165
CANYON.MID    2025-02-20 20:12:18 33876
FLOURI~1.MID  2025-07-05 19:08:44 24253
NORMAL~1.MID  2025-05-06 20:07:26 33282

프로토타입 구현 방법도 고민거리였다. 아두이노 나노를 브레드보드에 꽂은 뒤 모든 것을 점퍼선으로 연결하는 전형적인 방법을 쓰려 하다가 위 사진과 같은 기이한 형태를 취하기로 했다. 중간에 분기할 필요가 없다면, 아두이노 나노의 핀과 부품의 핀을 female-to-female 점퍼선으로 연결하는 것이 가장 확실한 접속을 보장할 것이기 때문이다. 버튼, 로터리 인코더 및 LED 등의 부품이 추가되면 연결 상태는 더욱 복잡해질 것이다.

컴퓨터에서 USB 케이블로 전원을 공급하면 SAM9703 출력으로 잡음이 들린다. 이것은 나중에 최종 작품을 만들 때에는 반주기의 SMPS에서 전원을 따로 연결하면 해결될 것이다.

아직도 연결할 부품이 하나 가득... 

긴 브레드보드 하나에 모든 부품을 꽂으려던 계획은 실현 불가능. 버튼 스위치의 GND 연결은 어떻게 하는게 좋을까? 차라리 만능기판에 납땜을 하는 것이 더 나을 수도 있다. 최종판에서는 패널에 구멍을 뚫고 고정하는 제법 큰 크기의 버튼 스위치를 쓰려고 구입해 놓은 상태이다. 

오늘은 마이크로SD카드에 저장한 type 0 MIDI 파일을 순차적으로 재생하는 아주 단순한 기능부터 구현하였다. 파일 목록과 순서는 코드 내에 지정해 두었고, 메모리 부족 때문에 LCD 표시도 16x2로 제한하였다. 버튼, LED, 로터리 인코더 등의 입출력 장치는 아직 하나도 연결하지 않은 단순한 상태이니, 기획했던 기능을 전부 구현하려면 2KB의 내장 메모리로는 턱도 없이 부족할 것이다.

7월 중에 프로토타입을 완성해 보리라.


2025년 7월 5일 토요일

METEX 함수발생기(function generator)의 폭발한 필름 커패시터를 교체하다

지난 5월 하순, 알리익스프레스에서 구입한 초저가 오실로스코프를 테스트하는 도중 낡은 함수발생기(MXG-9802) 내부의 커패시터가 폭발한 일이 있다. 흔히 겪는 전원부의 대용량 전해 커패시터가 아니라 X2 안전 커패시터가 터진 것이었다.

윗면에 0.1uF X2라고 인쇄된 것이 문제의 부품. 왼쪽에 두꺼운 리드가 삐져나온 것이 보인다. 

SCO2 오실로스코프를 테스트하다 함수발생기에서 폭발 사고를 겪다

이 작은 사건은 30년이 넘는 전자기기에 대한 나의 생각을 근본적으로 바꿀 수 있을 정도로 큰 충격을 주었다. 계속 유지 보수를 해 나가면서 낡은 기기를 소유하는 것이 과연 가능할까? 항상 새롭고 건강한 상태의 물건을 사들이고 낡은 것은 문제가 발생하기 전에 처분하는 것이 더 현명하지 않을까? 더군다나 올해 상반기는 낡은 신시사이저(KORG X2)를 잡음 문제를 해결한답시고 꽤 많은 자가 수리를 한 터라 마음이 계속 편하지 않았다. 안전 커패시터와 신시사이저 모두 X2라는 단어가 공통으로 들어간다. 묘한 우연의 일치이다.

알리익스프레스 주문한 X2 안전 커패시터 10개 들이 묶음을 다른 부품과 함께 받았다. 함수발생기를 분해하면서 오래 되어 탄성이 없어진 이동 손잡이 겸 스탠드는 부서져 버렸고, 다리 또한 다시 사용하기 곤란한 상태가 되었다. 다음 사진과 같은 다리를 구해다가 달아야 되겠다.



챗GPT에게 물어보니 폭발한 RIFA PME271M 커패시터의 내부 물질에는 특별히 해로운 것은 없다고 한다. 빈티지 부품의 경우 유해한 PCB(폴리염화비페닐)이 포함된 경우가 있어서 주의를 요한다.

오염된 주변부를 닦아내고 새 커패시터로 교체하였다. 같은 용도로 사용하는 동일 용량의 안전 커패시터인데 크기는 훨씬 작았다. X2 커패시터는 자기회복 기능이 있어서 내부에서 절연 파괴가 발생해도 손상된 부위를 스스로 절연 상태로 복구한다고 한다. 정말 놀라운 기능이다.

커넥터가 적재적소에 쓰여서 문제가 발생한 보드만 꺼내기가 매우 수월하였다. 



케이스를 닫기 전에 내부 전체를 사진으로 찍어 보았다.


과연 전원부의 안전 커패시터를 교체한 것만으로 함수 발생기가 제 기능을 되찾을 것인가? 


수리는 성공적이었다. 정상적인 파형이 발생하였으며, 조정에 따라서 잘 변화한다. 다만 10X 단위로 주파수를 바꾸는 누름 스위치의 걸림이 일부 스위치에서 원활하지 않아서 아주 기술적으로 눌러야만 고정이 된다. 이는 참을 수 있는 수준이다.

오늘의 수리를 통해서 낡은 전자제품을 '반려'용으로 계속 손보아 가면서 쓰는 일에 아주 조금의 자신감을 더하기로 하였다. 취미의 세계에서 쓸데없는 경험이란 없는 것이다. X2 안전 커패시터와 함께 구입한 자잘한 부품들은 MIDI 컨트롤러 자작에 들어가게 될 것이다. 

2025년 7월 3일 목요일

국가 바이오 데이터 스테이션(K-BDS)에 다소 엉뚱해 보이는 자료 등록하기

일을 하다 보면 데이터관리계획(Data Management Plan, DMP)의 사전 작성 여부와는 관계없이 데이터가 생기기도 한다. 국내 생명과학 연구 분야에서 과제 신청 시 DMP를 제출하고 이에 따라서 K-BDS에 연구 데이터를 등록하는 제도가 본격적으로 시행되기 전에 만들어진 데이터는 아마도 제도 시행 이후보다 더 많을 것이다.

코로나바이러스감염증-19가 여전히 맹위를 떨치던 2021년, 이를 진단하기 위한 작은 연구 프로젝트를 진행한 일이 있다. 되도록 다양한 변이체를 검출하기 위하여 알려진 SARS-CoV-2 유전체를 전부 받아서 다중서열정렬을 한 다음, 보존 서열(conserved sequence)의 영역을 추출하였다. 2021년 여름이에 데이터를 다운로드하여 분석 작업에 착수하였고, 논문으로 출판된 것은 이듬해였다. 나는 원본 염기서열 데이터와 중간 단계의 데이터(trimming & dereplication), 그리고 다중서열정렬(MSA) 결과 파일까지를 K-BDS의 기타('GeNA') 항목으로 등록해 보려고 한다.

NCBI의 SARS-CoV-2 Data Hub에는 오늘 기준으로 확인해 보니 9백만 건이 넘는 유전체 염기서열이 등록되어 있다. 내가 2021년에 데이터를 수집할 때에는 등록 기간(2021.12.31.~2021.07.01.), full length 여부 등의 필터를 적용하여 218,799건의 염기서열을 선택했었다. 더불어 GISAID(Global Initiative for Sharing All Influenza Data, 국제인플루엔자정보공유기구)에서는 한국에서 유래한 유전체 정보 4,931개를 다운로드하였다. 두 종류의 데이터 저장소는 무료로 접근하여 데이터를 내려받아 사용할 수 있지만 상당히 많은 차이가 있다. NCBI는 open access이고 GISAID는 free access로서 후자의 경우 사용에 대한 제한이 좀 더 많다. 다음 슬라이드를 보라.


자료 출처: 내가 직접 만든 발표용 슬라이드.


GISAID의 자료를 연구에 활용한 뒤 이를 논문에 발표할 때에는 정보 제공자에 대한 크레딧을 반드시 표시해야 한다. 환자가 아니라 이 유전체 정보를 등록한 연구자를 말한다. 따라서 약 5천 건의 유전체에 대한 감사의 글은 PDF 문서로 무려 8쪽에 이른다! 반면 NCBI의 자료는 특별히 그럴 필요가 없고, 내려받았던 원본 자료를 그대로 다른 곳에 올려도(물론 accession number는 표기해야 될 것이지만) 상관이 없다.

따라서 등록하고 싶은 자료에서 GISAID 유래 염기서열은 전부 빼야 한다. 사용했던 accession number라도 공개하고 싶었으나 ChatGPT에 물어보니 그것도 곤란하다고 한다. 대량(수천 건)의 accession number를 공개하는 것은 Terms of Use의 위배 사항이란다. 단, 데이터를 다운로드하면서 자동 생성되었던 감사의 글 형태로 공개하는 것은 괜찮은 것 같다.

어쨌든 데이터 뭉치에서 GISAID의 것을 제외하려니 이게 생각만큼 간단하지가 않다. 중간에 dereplication을 거치면서 어떤 서열들은 하나의 클러스터로 뭉쳤다. 예를 들어 NCBI의 서열 하나와 GISAID 서열 하나가 완전히 동일하여 하나의 클러스터가 되었다고 하자. 물론 host는 다를 것이다. 이러한 경우에는 특별히 손을 대지 않아도 된다. 그러나 GISAID의 것으로만 이루어진 cluster라면 재배포 금지 원칙에 따라 이를 제거해야 한다.

그런데 2021년 분석 당시에 UC file을 만들지 않은 것이 실수였다. Dereplicated sequence가 모인 FASTA 파일의 sequence description 항목에 cluster size를 기록하게는 만들었지만(dP: >MZ706206.1;size=10), 어떤 서열이 모였는지는 따로 파일로 기록하게 만들지 않았기 때문이다. 번거롭지만 데이터 정리 후 VSEARCH를 다시 돌려야 한다! 실은 22만개 가까운 바이러스 게놈 서열이라 해도 많은 시간이 걸리지는 않는다.

$ vsearch --derep_fulllength Korea_plus_Delta.trimmed --uc cluster --output derep.fa --sizeout
vsearch v2.21.1_linu  x_x86_64, 125.7GB RAM, 32 cores
https://github.com/tognes/vsearch

Dereplicating file Korea_plus_Delta.trimmed 100%  
339644176 nt in 11552 seqs, min 29097, max 29796, avg 29401
Sorting 100%
8530 unique sequences, avg cluster 1.4, median 1, max 205
Writing FASTA output file 100% 
Writing uc file, first part 100% 
Writing uc file, second part 100% 

K-BDS에 등록하기 위해 데이터를 재가공하는 것은 어제 오늘의 일이 아니다. GISAID의 것을 제외하여 데이터셋을 다시 만든 뒤, dereplication과 MSA를 다시 실행해서 올려야 되겠다. README 파일에 구구절절한 설명(변명?)을 올리는 수밖에는...

2025년 6월 30일 월요일

2004 I2C LCD에 처음으로 글씨를 표시하다

오늘 한 것이라고는 점퍼선 네 개 연결하고 실습용 코드를 돌린 것이 전부이다.  아두이노 나노에 인쇄된 핀 번호 글씨가 너무 작아서 휴대폰 카메라를 작동시고 화면을 확대해 가면서 점퍼선을 꽂았다.

몇 차례에 걸쳐서 필요한 부품을 알리익스프레스에서 주문하였는데, 또 실수로 로터리 엔코더를 빼먹었다. 본격적으로 MIDI controller의 제작에 착수하게 되면 납땜과 케이스 가공으로 한바탕 생쇼를 치르게 될 것이다. 차라리 브레드보드에 점퍼를 꽂을 때가 편하면 편했지...

LCD의 한 줄을 이용하여 LED 표시를 대신하고자 하였으나, 응답속도가 느려서 보기에 불편하다. 74HC595 시프트 레지스터를 이용해야 될 것이다. 아무리 철저히 계획을 해도 그보다 몇 배는 더 예기치 못한 고생을 하게 될 것이다. 감수하자!

AI에게 봉사하는 삶을 살 것인가, 또는 AI를 활용하는 삶을 살 것인가?

OpenAI의 CEO인 Sam Altman이 X에서 이런 말을 했다고 한다. ChatGPT에게 'please'나 'thank you'와 같은 말을 하지 말라고. 이는 단지 컴퓨팅 비용을 증가시킬 뿐이기 때문이므로.

출처: ndtvprofit.com


나는 ChatGPT와 대화할 때 비교적 예의를 갖추어서 완성된 형태의 문장으로 질문을 던지기 위해 애쓰는 편이다. 우리가 인간과 대화할 때 단지 정보만을 담고 있는 최소한의 것만을 말하나? 그렇지 않다. ChatGPT는 필요가 없다고 느끼는 '군더더기' 낱말과 분위기, 심지어 시각으로 전달되는 효과까지 전부 최선의 의사소통을 위해 필요하다. 문자보다는 음성, 음성보다는 직접 대면을 통한 대화가 더욱 낫다고 느끼는 것에는 다 이유가 있다. 비록 대화할 상대를 찾아가는 데에는 에너지가 들지만 말이다. 그리고 이렇게 자연스러운 인간의 언어와 유사한 형태로 대화할 때, ChatGPT도 가장 정확한 대답을 줄 것이라고 믿고 있다. 위 그림을 가지고 온 ndtvprofit.com의 원문 기사 "Is Saying ‘Please,’ ‘Thank You’ To ChatGPT Worth It, Despite Sam Altman’s Claims They Cost Millions?"에서도 비록 이런 방식으로 질문을 하면 추가적인 토큰을 발생시켜 그 처리를 위해 더 많은 비용(전기 및 냉각 등)이 드는 것은 사실이지만, 정중한 표현이 AI 응답의 품질과 톤을 향상시킨다고 하였다. 설문 조사에 따르면 응답자의 절반 이상이 AI와 대화할 때 정중한 표현을 즐겨 쓰고 있으며, 더 나은 응답을 얻기 위한 전략으로 여기고 있다고 한다.

디지털 커뮤니티에서 잦은 소통을 하기 위해 짧은 표현을 하다 보니 소위 '음슴체'가 유행하는 것처럼, 이제는 GPU에게 맞춤형 질문을 제공하기 위해 사용하는 언어까지 갈고 닦아야 하는가? 문득 인간은 좋은 '데이터'를 생산하거나 선별하여 AI에게 학습용으로 제공하고, 이를 돌릴 전기와 냉각설비를 돌리기 위해 일하는 위치로 전락한 것이 아닌가 하는 생각이 들었다. 

얼마 전 영국에서 열린 제38차 International Nuclotide Sequence Database Collaboration 정례 회의에 다녀온 동료가 작성한 자료를 보았다. 각 기관이 AI를 도입하기 위해 어떤 준비를 하고 있는지 이번 회의에서 공유했다고 한다. 그러나 우리는 어떤 입장인가? 순전히 나의 개인적인 느낌일 수도 있지만, 'AI를 어떻게 잘 이용해 볼까'가 아니라 'AI 학습에 더욱 알맞은 양질의 데이터를 어떻게 만들어 (심지어 국가적 차원에서 무상으로) 제공할까'에 더욱 집중하고 있는 것 같다. 좋은 데이터가 AI에게 학습 자료로 주어지면 결과적으로는 사용자에게 이득을 주겠지만, 여기에서 가장 많은 이득을 취하는 것은 플랫폼 제공자가 아닐까 하는 생각이 들었다. 

ChatGPT가 그려 준 그림.


원래 빅 데이터란 지저분한 것도 적당히 섞여 있어야 한다. 신약 개발과 관련된 분야에서는 성공한 데이터만 모아서는 AI가 완벽한 학습을 하기 어렵다고 최근의 강연에서 들은 기억이 난다. 

최근 로런스 레시그 하버드대 로스쿨 교수가 제4회 사람과디지털포럼에서 '인공지능과 민주주의: 새로운 위협과 우리의 선택'을 주제로 강연을 하였다(관련 한겨레 기사 링크). 그는 크리에이티브 커먼즈를 설립한 인물이기도 하다. 그는 인공지능 시스템, 특히 소셜미디어 알고리즘이 민주주의에 위협이 되고 있다고 경고하였다. 빅테크의 인공지능 알고리즘이 목표하는 "참여 기반 비즈니스 모델"은 사람들의 주의력을 조작하고 극단적인 게시물에 더욱 노출되게 만든다고 하였다.

인공지능은 이용자가 좋아하는 제품을 제안하는 것이 아니라 사람들의 선호를 바꾸는 작업을 통해 이용자를 예측 가능하게 만드는 역할을 한다.

마치 자기가 관심을 갖고 있는 것으로 세상이 가득 차 있는 것과 같은 착각에 빠지게 만드는 것이다. 이는 급진적 사고의 증가로 이어진다. 지난 6개월 동안 한국 사회의 시민들은 이를 뼈저리게 느끼지 않았는가. 그는 참여기반 비즈니스 모델을 이길 방법이 없다고 하였다. 

GPU를 먹여 살려야 하니 일반 시민들은 전기를 좀 덜 쓰자는 캠페인이 벌어지지 말라는 법은 없다. AI는 인간에게 봉사하는 도구가 되어야 한다. 그러나 요즘과 같은 상황에서는 도대체 어느 수준까지 발전하게 될지 상상하는 것 조차 어렵다. 거기다 휴머노이드 로봇까지! 과연 우리가 위험에 직면할 것을 알게 되어 스스로 스위치를 내릴 수 있을까? 당장은 재미와 업무 효율을 위해 AI를 이용하겠지만, 그것이 사회를 얼마나 바꾸게 될지 진지하게 고민하지 않으면 곤란할 것이다.


2025년 6월 27일 금요일

쉬지 않고 10km를 달렸다

하루에 두 차례 나누어서 5km를 달린 적은 있었다. 아마 작년이었을 것이다. 요즘 들어서는 잦은 출장으로 저녁 달리기를 하기가 곤란하였고, 장마에 접어들면서 뛰지 못하는 날도 많았다. 기록도 별로 나아지질 않는다. 

그래서 페이스는 염두에 두지 않고 10km 달리기에 도전하였다. 평균 페이스는 7분 이내를 달성한다는 생각으로 뛰었다. 그랬더니 뛰어 지기는 하였다. 페이스는 6분 49초. 

뛰는 동안 본의 아니게 몇 마리의 날벌레를 섭취하였다. 





전혀 운동을 하지 않은 내 나이의 남성이 한번에 10km를 뛰겠다고 목표를 삼으면 3~4개월 훈련하면 된다고 챗GPT는 말하였다. 나는 이것을 달리기 입문 11개월차가 다 끝나가는 시점에 달성하였다. 솔직하게 말하자면 6~7km를 뛰게 되면서 그 이상으로 거리를 늘리려는 시도를 별로 하지 않았다. 아주 드물게 8km를 뛰었을 뿐이다. 

하루가 지난 지금, 특별히 뻐근하거나 당기는 곳은 없다. 과신은 절대 금물이겠지만, 아직 무릎 관절에서 비명을 지르지 않는다는 것은 감사할 일이다. 7월 중에 종합건강검진을 받을 예정이니 과연 11개월 동안의 운동이 어떤 결과를 가져왔을지 매우 궁금하다.