User Tools

Site Tools


workshop:통신

This is an old revision of the document!


Table of Contents

컴퓨터와 통신 하기 RS232

Rs232

Python 설치

* Python 2.7.3 http://python.org/download/ * Pyserial Win32 (pyserial-2.5.win32.exe)

 google에서 pyserial win32 검색


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

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/통신.1342741515.txt.gz · Last modified: 2018/07/18 14:09 (external edit)