본문 바로가기

전체 글210

아두이노 통신 UNO TO UNO -#4 우노B의 연결은 우노A에서 오는 통신 시리얼통신 포트룰 2,3번 핀에 연결하는것과 I2C통신을 위한 2핀과 VCC, GND를 포함하여 총 6개의 핀이 연결되어 있다. 우노B의 소스코드 부터 보자 #include #include SoftwareSerial sSerial= SoftwareSerial(2, 3); //HardwareSerial& sSerial = Serial2; #define version 0x01 #define BAUD 9600 typedef struct _Info { char ver; char lcd_1[20+1]; _Info() { ver = version; memset(lcd_1, 0x00, sizeof(char)*21); } }Info; //LiquidCrystal_I2C lcd(0x.. 2021. 11. 16.
아두이노 통신 UNO TO UNO -#3 우노A의 소스코드는 2개의 함수로 구성되어 있다. 1. 시리얼모니터를 이용하여 컴퓨터로 부터 입력 받는 함수 2. 소프트웨어 시리얼을 통하여 우노B로 전송하는 함수 2번 함수는 너무 단순해서 설명할 것도 없다. 1번 함수만 공부하면 될것이다. 시리얼 모니터를 통해서 엔터를 입력 할 때까지 무한 대기 상태로 들어간다. 처음 나오는 while 문장으로 이루어 진다. 시리얼 데이터가 있다면 한 바이트씩 읽는다. 읽은 데이터를 버퍼에 저장하지만 20글자를 초과하면 더 이상 입력받지 않고 버린다. 데이터는 포인터를 이용해서 저장한다. 입력된 데이터가 있고 정상적인 엔터가 입력 되었다면 버프의 데이터를 구조체로 복사 한다. 딱히 어려운 문장은 없을수도 있지만, 포인터에 익숙하지 않다면 어려워 보일 수도 있다. 그래.. 2021. 11. 16.
아두이노 통신 UNO TO UNO -#2 우노A의 연결은 2번, 3번 핀을 우노 B와 연결해서 시리얼 통신을 할 것이다. 추가로 연결한것은 없다. 우노A의 소스코드를 보자 #include #include SoftwareSerial sSerial= SoftwareSerial(2, 3); //HardwareSerial& sSerial = Serial2; #define version 0x01 #define BAUD 9600 typedef struct _Info { char ver; char lcd_1[20+1]; _Info() { ver = version; memset(lcd_1, 0x00, sizeof(char)*21); } }Info; void setup() { Serial.begin(BAUD); sSerial.begin(BAUD); } void.. 2021. 11. 16.
아두이노 통신 UNO TO UNO -#1 아두이노 대 아두이노 통신을 할것이다. 하고 싶은것은 우노2대을 통신으로 시리얼 입력으로 출력하는것이다. 프로그래머가 혹은 코딩을 하기전에 프로그램의 스펙을 정해야 한다. 몇 글자를 전송할지, 전송하고자 하는 데이터는 어떤게 있는지 정하는것이다. 일단 아래와 같이 요건부터 정의를 하자. 1. 먼저 많고 많은 통신중에 제일 먼저 할 것은 시리얼 통신이다. 2. 우노A에서 문자를 전송하면 우노B의 LCD를 통해서 출력 할 것이다. 3. 우노A의 문자는 시리얼모니터를 통해서 입력을 받을것이다. 4. 우노A의 문자열의 길이는 최대 20글자를 하는것으로 할 것이다. 5. 우노A의 입력은 엔터를 입력 할 때까지 무한 대기 상태로 있을것이다. 6. 우노A의 문자열의 길이가 있을경우 우노B로 전송한다. 7. 우노B는 .. 2021. 11. 16.
파이썬, 데이터베이스 그리고 아두이노 통신 -#3 이전에 올린 코드는 완성된 코드이지만, 사실 완성된 코드는 아니다. 단지 시리얼 통신으로 유선으로 컴퓨터로 통신하고 있다. 이것 또한 거리가 있다면 무선, 블루투스, 지그비, 와이파이, 로라등으로 변경하면 될것이다. 사실 변경 자체가 어렵지는 않다. 단지 한, 두줄 수정하면 된다. 다양한 예제를 제공 할 수있지만, 한두줄 수정을 굳이 설명할 필요는 없을것이다. 그리고 데이터 개수의 추가 이다. 단지 고정된 정수값, 실수값으로 했다. 이것도 본인들이 원하는, 측정값으로 변경하면 될것이다. 개수를 여러개 한다거나, 데이터 종류를 추가하는일이다. 그렇다고 크게 변경되지는 않는일이다. 어차피 정수, 실수, 문자열의 범주속에 있다. 이것 수정 또한 한줄 정도면 가능하다. 한두줄을 강조하는 의미는 크게 어렵지는 않.. 2021. 10. 6.
파이썬, 데이터베이스 그리고 아두이노 통신 -#2 아두이노쪽에서 31바이틀 보내오고 있지만, 데이터베이스에서는 더 많은 데이터를 저장하고 있다. 추가된 내용은 순번, 날짜시간이다. 이것 또한 개인 취향이기는 한데, 순번과 날짜시간이 같이 저장된다면 나중에 데이터분석에 용의 할 것이다. 그렇다고 날짜, 시간을 아두이노에서 구할 필요는 없다. 만약 구한다면 어리석은 일이다. 한마디로 굳이라고 할 수있다. import struct import serial, time import sqlite3 import datetime #먼저 메모리에만 저장(임시) #con = sqlite3.connect(":memory:") #데이터베이스 파일에 저장 con = sqlite3.connect("arduino.db") #커서 객체를 생성 cur = con.cursor() #테.. 2021. 10. 6.
파이썬, 데이터베이스 그리고 아두이노 통신 -#1 이전에 했던것에서 조금 업그레이드 했다. 아두이노에서 받은 데이터를 데이터베이스에 기록하는것이다. 말이 유창해서 데이터베이스 이지만 사실 파일에 기록해도 비슷한 결과를 줄것이다. 아두이노에서 31바이트의 데이터를 제공하고 있다. 문자열, 정수, 실수, 실수해서 총합이 31바이트이다, 파이썬 코드는 그것을 받아서 출력과 같이 데이터베이스에 저장을 하는것이다. 코드가 몇줄 더 길어 졌지만 크게 어려운것은 없다. 테이블이 존재하면 만들지 않을것이고 존재한다면 넘어 갈것이다. 그리고 나머지는 저번에 했던 내용이다. 2021. 10. 6.
파이썬 바이너리파일 쓰기 -#9 이제 문자, 문자열, 숫자를 썩어서 아두이노에서 전송해 보자. typedef struct _Info { char cc; char ss[20]; int age; double height; double weight; _Info() { cc = '1'; strcpy((char*)(ss), "arduino is best"); age =30; height = 1024.0; weight = 768.1; } }Info; Info a; volatile unsigned long previousMillis; void setup() { Serial.begin(9600); previousMillis = millis(); // Serial.println(sizeof(int)); // Serial.println(sizeof(fl.. 2021. 10. 4.
파이썬 바이너리파일 쓰기 -#8 이제 문자와 문자열에 대해서 다루어 보자. 이전에 비해 딱히 어려운것은 없으나 문자열은 크기를 명기 해야 한다, import struct #문자와 문자열20바이트 파일에 읽고 쓰기 # writing data cc = b'1' ss = b'hello wolrd' data = struct.pack('=c20s', cc, ss) f = open('string.dat','wb') f.write(data) f.close() # reading data f = open('string.dat','rb') data = f.read() (cc, ss) = struct.unpack('=c20s', data) print( cc, ss) print(len(data)) 2021. 10. 4.