User Tools

Site Tools


workshop:통신

This is an old revision of the document!


컴퓨터와 통신 하기 RS232

Rs232

Python 설치

arduino code

int ledPin = 13;
int value;
 
void setup() {
  pinMode(ledPin, OUTPUT);   
  Serial.begin(9600);
}
 
void loop() {
  if (Serial.available() > 0) {
    value = Serial.read();
    if (value == '1') { 
    digitalWrite(ledPin, HIGH);
    } else {
    digitalWrite(ledPin, LOW);
    }
  }
}

pyserial

pyserial을 설치하고, 파이썬 인터프리터에서 다음과 같이 입력해보자. 어떻게 될지 예상해보자.

>>> import serial
>>> s = serial.Serial('/dev/ttyUSB0')
>>> s.write('1')
1
>>> s.write('0')
1
>>> 

python gui button

from Tkinter import *
import sys

import serial
port = '/dev/ttyUSB0'  # TODO: change port name
speed = 9600

def send(char):
    ser = serial.Serial(port,speed)
    ser.setDTR()
    ser.flushInput()
    ser.write(char)
    ser.close()

def toggle_switch():
    if switch_button["text"] == "Turn On":
        send('1')
        switch_button["text"] = "Trun Off"
    else:
        send('0')
        switch_button["text"] = "Turn On"

root = Tk()
root.title('Switch')
switch_button = Button(root, text="Turn On",command=toggle_switch)
switch_button.pack()

root.mainloop()

칩간에 통신을 실험해보자!

WS2801

LED 드라이버

회로도

Time

int SDI = 11; // PIN 11
int CKI = 12; // PIN 12
int ledPin = 13; // LED

void setup() {
  pinMode(SDI, OUTPUT);
  pinMode(CKI, OUTPUT);
  pinMode(ledPin, OUTPUT);
  
  //Serial.begin(9600);
  //Serial.println("Hello!");
}

void loop() {
  delay(2000);

  while(1){ 
    post_frame(0xFF0000); //현재 칼라를 WS2801에 적용한다.

    // CLK pin keeps low more than 500uS will make the WS2801 internal status register reset
    digitalWrite(CKI, LOW);
    delayMicroseconds(500);
    
    digitalWrite(ledPin, HIGH);    
    delay(250);                  
    digitalWrite(ledPin, LOW);   
    delay(250);                  
  }
}

// this_led_color값의 비트를 ws2801에 CKI에 맞추어 SDI를 밀어 넣는다.
void post_frame (long this_led_color) {
  for(byte color_bit = 23 ; color_bit != 255 ; color_bit--) {
      //23비트가 처음! 빨간색 (red data MSB)
      
      digitalWrite(CKI, LOW); //클럭이 LOW일때 데이터를 받아 들인다.
      
      long mask = 1L << color_bit;
      //The 1'L' forces the 1 to start as a 32 bit number, otherwise it defaults to 16-bit.
      
      if(this_led_color & mask) 
        digitalWrite(SDI, HIGH);
      else
        digitalWrite(SDI, LOW);
  
      digitalWrite(CKI, HIGH); //클럭이 HIGH일때 데이터를 적용(latch) 한다.
  }
}

여러개 보낼경우. 이어서 보낸다.

post_frame(0xFF0000); //첫번째 프레임
post_frame(0x00FF00); //두번째 프레임
// CLK pin keeps low more than 500uS will make the WS2801 internal status register reset
digitalWrite(CKI, LOW);
delayMicroseconds(500);
  

I2C

I2C 직렬 컴퓨터 버스 주변기기를 연결하기 위해 사용된다.

데이터와 클럭은 pull-up

Time

실제 실험 해보기 24LC256

arduino i2c 관련 핀

  • Analog4 - SDA
  • Analog5 - SCL

Time

#include <Wire.h> //Include the Arduino I2C Library

void i2c_eeprom_write_byte( int deviceaddress, unsigned int eeaddress, byte data ) {
  int rdata = data;

  Wire.beginTransmission(deviceaddress);
  Wire.write((int)(eeaddress >> 8)); // MSB
  Wire.write((int)(eeaddress & 0xFF)); // LSB
  Wire.write(rdata);
  Wire.endTransmission();
}

void i2c_eeprom_write_page( int deviceaddress, unsigned int eeaddresspage, byte* data, byte length ) {
  Wire.beginTransmission(deviceaddress);
  Wire.write((int)(eeaddresspage >> 8)); // MSB
  Wire.write((int)(eeaddresspage & 0xFF)); // LSB

  byte c;
  for ( c = 0; c < length; c++)
    Wire.write(data[c]);

  Wire.endTransmission();
}

byte i2c_eeprom_read_byte( int deviceaddress, unsigned int eeaddress ) {
  byte rdata = 0xFF;

  Wire.beginTransmission(deviceaddress);
  Wire.write((int)(eeaddress >> 8)); // MSB
  Wire.write((int)(eeaddress & 0xFF)); // LSB
  Wire.endTransmission();
  Wire.requestFrom(deviceaddress,1);

  if (Wire.available()) rdata = Wire.read();

  return rdata;
}

void setup() {
  char data[] = "hello world";
  Wire.begin(); //Start I2C connections
  Serial.begin(9600);
  i2c_eeprom_write_page(0x50, 0, (byte *)data, sizeof(data)); // write to EEPROM

  delay(10); //add a small delay

  Serial.println("Memory written");
}

void loop() {
  int addr=0; //EEPROM Address 0
  byte b = i2c_eeprom_read_byte(0x50, 0); // access the first address from the memory

  while (b!=0) {
   Serial.print((char)b); //print content to serial port
   addr++; //increase address
   b = i2c_eeprom_read_byte(0x50, addr); //access an address from the memory
 }

  Serial.println(" ");
  delay(2000);
}

master가 slave에 데이터를 보낸다.

master가 slave의 데이터를 읽는다.

workshop/통신.1342774075.txt.gz · Last modified: 2018/07/18 14:09 (external edit)