2014-05-19 2 views
1

코코아에서 arduino로 정수를 전송할 수 있어야합니다.popen을 통해 정수를 보내는 방법은 무엇입니까?

문자를 전송하는 것은 쉽습니다. 즉, 한자리 숫자 정수를 전송하기가 쉽지만 두 자리 및 세 자리 정수를 보내는 방법을 찾지 못하는 것 같습니다.

이것의 목적은 지금까지 0에서 255

에 지속적으로 LED가 밝기를 제어하기 위해, 나는 다음과 같은 코드를 사용하여 ON과 OFF를 설정할 수 있습니다 중 하나입니다 : 그러나

int ledPin = 9; // LED connected to digital pin 9 
int incomingByte = 0; // for incoming serial data 


void setup() {     
    // initialize the digital pin as an output: 
    pinMode(ledPin, OUTPUT); 
    Serial.begin(9600); 
} 

void loop()      
{ 

    if (Serial.available() > 0) { 
    // read the incoming byte: 
    incomingByte = Serial.read(); 
    if(incomingByte == 105){   //105 corresponds to i and is programmed in cocoa to turn the LED on 
     digitalWrite(ledPin, HIGH); 
    } 
    else if(incomingByte == 111){ //111 corresponds to o and is programmed in cocoa to turn the LED on 
     digitalWrite(ledPin, LOW); 
    } 
    } 
} 

을 , 0에서 255 사이의 값을 설정하는 방법을 해결할 수 없습니다. 'digitalWrite'대신 'AnalogWrite'를 사용하지만 incomingByte를 0에서 255 사이의 값으로 보내는 방법을 모르겠습니다.

이것은 코코아 코드입니다 :

#import "MainController.h" 

@implementation MainController 


-(IBAction)ledOn:(id)sender{ 
     popen("echo i > /dev/cu.usbmodem1411", "r"); 

} 

-(IBAction)ledOff:(id)sender{ 
     popen("echo o > /dev/cu.usbmodem1411", "r"); 
} 


@end 

감사합니다.

답변

0

arduino 코드에서 둘 이상의 숫자가있는 정수를 cstring으로 처리 한 다음 atoi()을 통해 정수로 변환 할 수 있습니다.

다음 코드는 CString을로 시리얼 버퍼에서 바이트를 캡처 :

char buffer[MAX_BUFFER_SIZE]; // global c character array variable 

boolean inputReady() 
{ 
    byte index = 0; 
    byte avail = Serial.available(); 
    if(avail > 0) 
    { 
    while(index < avail) 
    { 
     byte val; 
     do 
     { 
     val = Serial.read(); 
     } 
     while (val == -1); // if value is no longer -1, bytes are captured 
     buffer[index] = val; 
     index++; 
    } 
    buffer[index] = 0; //terminate the character array 
    return true; 
    } 
    return false; 
} 

참고 :가 나는 그것이 더 많은 메모리를 사용하기 때문에 아두 이노 IDE에 내장 된 String 클래스보다 cstrings을 선호하지만, 수 cstring을 잘 사용하지 않으면 메모리 누수가 발생하기 쉽기 때문에 cstring을 사용할 때는주의하십시오. 그런 다음 popen()를 통해 코코아 코드에서 문자열로의 PWM 값을 보낼 수 있습니다

void loop() 
{ 
    if(inputReady()) 
    { 
    int pwmValue = atoi(buffer); // convert ascii buffer to integer. 
    if(pwmValue >= 0 && pwmValue <= 255) // filter values from 0-255 
     analogWrite(ledPin, pwmValue); 
    else 
     digitalWrite(ledPin, LOW); // turn off if pwmValue is more than 255 
    } 
    delay(100); 
} 

:

이 당신의 loop() 블록처럼 보이는 방법이다.

#import "MainController.h" 

@implementation MainController 


-(IBAction)ledPWMValue:(id)sender{ 
     popen("echo 254 > /dev/cu.usbmodem1411", "r"); 

} 

@end 

나는 이것을 Arduino Uno에서 테스트했으며, 다른 변형에서도 작동 할 것입니다. 나는 이것이 당신의 프로젝트와 행운에 도움이되기를 바랍니다.