【Openmv和arduino】电平编码通信

电平编码通信,即38通信,io口电平变化判定7种状态。
在这里插入图片描述
底下有最后版本。
这个程序有错误:
Openmv:

from pyb import Pin
import time

value=[0,0,0]

p_in_0 = Pin('P0', Pin.IN, Pin.PULL_UP)#设置p_in为输入引脚,并开启上拉电阻
p_in_1 = Pin('P1', Pin.IN, Pin.PULL_UP)#设置p_in为输入引脚,并开启上拉电阻
p_in_2 = Pin('P2', Pin.IN, Pin.PULL_UP)#设置p_in为输入引脚,并开启上拉电阻

value[0] = p_in_0.value() # get value, 0 or 1#读入p_in引脚的值
value[1] = p_in_1.value() # get value, 0 or 1#读入p_in引脚的值
value[2] = p_in_2.value() # get value, 0 or 1#读入p_in引脚的值
while(True):
    print('value=',value)##000为arduino输出高电平
    time.sleep(2000)

这个程序有错误:
arduino:

#define code_a 2
#define code_b 3
#define code_c 4

void setup() {
  // put your setup code here, to run once:
  pinMode(code_a,OUTPUT);
  pinMode(code_b,OUTPUT);
  pinMode(code_c,OUTPUT);
}

void loop() {
  // put your main code here, to run repeatedly:
  analogWrite(code_a,HIGH);
  analogWrite(code_b,HIGH);
  analogWrite(code_c,HIGH);

}

在这里插入图片描述
在这里插入图片描述

这个没用,switch写实现不了

#define code_a 2
#define code_b 3
#define code_c 4
int a=2;
void setup() {
    // put your setup code here, to run once:
    Serial.begin(9600);
    pinMode(code_a,OUTPUT);
    pinMode(code_b,OUTPUT);
    pinMode(code_c,OUTPUT);
}

      

void loop() {
  a=1;
  switch(a){
    case 0:
      digitalWrite(code_a,HIGH);
      digitalWrite(code_b,HIGH);
      digitalWrite(code_c,HIGH); 
    case 1:
      digitalWrite(code_a,LOW);
      digitalWrite(code_b,HIGH);
      digitalWrite(code_c,HIGH); 
    case 2:
      digitalWrite(code_a,HIGH);
      digitalWrite(code_b,LOW);
      digitalWrite(code_c,HIGH); 
    case 3:
      digitalWrite(code_a,LOW);
      digitalWrite(code_b,LOW);
      digitalWrite(code_c,HIGH); 
    case 4:
      digitalWrite(code_a,HIGH);
      digitalWrite(code_b,HIGH);
      digitalWrite(code_c,LOW); 
    case 5:
      digitalWrite(code_a,LOW);
      digitalWrite(code_b,HIGH);
      digitalWrite(code_c,LOW); 
    case 6:
      digitalWrite(code_a,LOW);
      digitalWrite(code_b,LOW);
      digitalWrite(code_c,HIGH); 
    case 7:
      digitalWrite(code_a,LOW);
      digitalWrite(code_b,LOW);
      digitalWrite(code_c,LOW);     
  }
  delay(10);
}

可运行程序版本单向通信,arduino发openmv收

python:

from pyb import Pin
import time

v=[0,0,0]
num=[0,0,0,0,0,0,0,0]
count=200
p_in_0 = Pin('P7', Pin.IN, Pin.PULL_DOWN)#设置p_in为输入引脚,并开启上拉电阻
p_in_1 = Pin('P8', Pin.IN, Pin.PULL_DOWN)#设置p_in为输入引脚,并开启上拉电阻
p_in_2 = Pin('P9', Pin.IN, Pin.PULL_DOWN)#设置p_in为输入引脚,并开启上拉电阻


#p_in = Pin('P7', Pin.IN, Pin.PULL_UP)#设置p_in为输入引脚,并开启上拉电阻

def getCode():
    while(True):
        pass
        v[0] = p_in_0.value() # get value, 0 or 1#读入p_in引脚的值
        v[1] = p_in_1.value() # get value, 0 or 1#读入p_in引脚的值
        v[2] = p_in_2.value() # get value, 0 or 1#读入p_in引脚的值
        if v[0]==0 and v[1]==0 and v[2]==0:
            num[0]+=1
            if num[0]>count:
                print('value=',0)##000为arduino输出高电平
                num[0]=0
                #return(0)
                break
        elif v[0]==0 and v[1]==0 and v[2]==1:
            num[1]+=1
            if num[1]>count:
                print('value=',1)##000为arduino输出高电平
                num[1]=0
                return(1)
                break
        elif v[0]==0 and v[1]==1 and v[2]==0:
            #print('value=',2)##000为arduino输出高电平
            num[2]+=1
            if num[2]>count:
                print('value=',2)##000为arduino输出高电平
                num[2]=0
                return(2)
                break
        elif v[0]==0 and v[1]==1 and v[2]==1:
            #print('value=',3)##000为arduino输出高电平
            num[3]+=1
            if num[3]>count:
                print('value=',3)##000为arduino输出高电平
                num[3]=0
                return(3)
                break
        elif v[0]==1 and v[1]==0 and v[2]==0:
            #print('value=',4)##000为arduino输出高电平
            num[4]+=1
            if num[4]>count:
                print('value=',4)##000为arduino输出高电平
                num[4]=0
                return(4)
                break
        elif v[0]==1 and v[1]==0 and v[2]==1:
            #print('value=',5)##000为arduino输出高电平
            num[5]+=1
            if num[5]>count:
                print('value=',5)##000为arduino输出高电平
                num[5]=0
                return(5)
                break
        elif v[0]==1 and v[1]==1 and v[2]==0:
            #print('value=',6)##000为arduino输出高电平
            num[6]+=1
            if num[6]>count:
                print('value=',6)##000为arduino输出高电平
                num[6]=0
                return(6)
                break
        elif v[0]==1 and v[1]==1 and v[2]==1:
            #print('value=',7)##000为arduino输出高电平
            num[7]+=1
            if num[7]>count:
                print('value=',7)##000为arduino输出高电平
                num[7]=0
                return(7)
                break
        pass

while(True):
    while(True):
        pass
        code=getCode()
        if code!=None:
            print('got the code, code is',code)
            break
        else:
            print('NO code')
            time.sleep(1000)
    while(True):
        pass
        #print('have code')
        
     

Arduino:

#define code_a 2
#define code_b 3
#define code_c 4
int count=2;
int a=0;
int i=0;
void setup() {
    // put your setup code here, to run once:
    Serial.begin(9600);
    pinMode(code_a,OUTPUT);
    pinMode(code_b,OUTPUT);
    pinMode(code_c,OUTPUT);
}
      

void sentCode(int b) {
  if (b==7){
    
      digitalWrite(code_a,HIGH);
      digitalWrite(code_b,HIGH);
      digitalWrite(code_c,HIGH); } 
   else if (b==6){
      digitalWrite(code_a,LOW);
      digitalWrite(code_b,HIGH);
      digitalWrite(code_c,HIGH); } 
    else if (b==5){
      digitalWrite(code_a,HIGH);
      digitalWrite(code_b,LOW);
      digitalWrite(code_c,HIGH);}
    else if (b==4){
       digitalWrite(code_a,LOW);
      digitalWrite(code_b,LOW);
      digitalWrite(code_c,HIGH); }
    else if (b==3){
       digitalWrite(code_a,HIGH);
      digitalWrite(code_b,HIGH);
      digitalWrite(code_c,LOW); }
    else if (b==2){
       digitalWrite(code_a,LOW);
      digitalWrite(code_b,HIGH);
      digitalWrite(code_c,LOW); }
    else if (b==1){
       digitalWrite(code_a,HIGH);
      digitalWrite(code_b,LOW);
      digitalWrite(code_c,LOW);}
    else if (b==0){
       digitalWrite(code_a,LOW);
      digitalWrite(code_b,LOW);
      digitalWrite(code_c,LOW);  }
   
    delay(2000);
  }



void loop(){

      sentCode(2);
      while(1){;}

       
       while(0){      
        if(a>7){a=0;}
        Serial.print("a=");
        Serial.println(a);             
        sentCode(a);   
        a=a+1;
       
       }
       
}

结果。
在这里插入图片描述

双向通信

openmv:

from pyb import Pin
import time

v=[0,0,0]
num=[0,0,0,0,0,0,0,0]
count=200

def getCode():
    pass
    p_in_0 = Pin('P7', Pin.IN, Pin.PULL_DOWN)#设置p_in为输入引脚,并开启上拉电阻
    p_in_1 = Pin('P8', Pin.IN, Pin.PULL_DOWN)#设置p_in为输入引脚,并开启上拉电阻
    p_in_2 = Pin('P9', Pin.IN, Pin.PULL_DOWN)#设置p_in为输入引脚,并开启上拉电阻    
    while(True):
        pass
        v[0] = p_in_0.value() # get value, 0 or 1#读入p_in引脚的值
        v[1] = p_in_1.value() # get value, 0 or 1#读入p_in引脚的值
        v[2] = p_in_2.value() # get value, 0 or 1#读入p_in引脚的值
        if v[0]==0 and v[1]==0 and v[2]==0:
            num[0]+=1
            if num[0]>count:
                print('value=',0)##000为arduino输出高电平
                num[0]=0
                #return(0)
                break
        elif v[0]==0 and v[1]==0 and v[2]==1:
            num[1]+=1
            if num[1]>count:
                print('value=',1)##000为arduino输出高电平
                num[1]=0
                return(1)
                break
        elif v[0]==0 and v[1]==1 and v[2]==0:
            #print('value=',2)##000为arduino输出高电平
            num[2]+=1
            if num[2]>count:
                print('value=',2)##000为arduino输出高电平
                num[2]=0
                return(2)
                break
        elif v[0]==0 and v[1]==1 and v[2]==1:
            #print('value=',3)##000为arduino输出高电平
            num[3]+=1
            if num[3]>count:
                print('value=',3)##000为arduino输出高电平
                num[3]=0
                return(3)
                break
        elif v[0]==1 and v[1]==0 and v[2]==0:
            #print('value=',4)##000为arduino输出高电平
            num[4]+=1
            if num[4]>count:
                print('value=',4)##000为arduino输出高电平
                num[4]=0
                return(4)
                break
        elif v[0]==1 and v[1]==0 and v[2]==1:
            #print('value=',5)##000为arduino输出高电平
            num[5]+=1
            if num[5]>count:
                print('value=',5)##000为arduino输出高电平
                num[5]=0
                return(5)
                break
        elif v[0]==1 and v[1]==1 and v[2]==0:
            #print('value=',6)##000为arduino输出高电平
            num[6]+=1
            if num[6]>count:
                print('value=',6)##000为arduino输出高电平
                num[6]=0
                return(6)
                break
        elif v[0]==1 and v[1]==1 and v[2]==1:
            #print('value=',7)##000为arduino输出高电平
            num[7]+=1
            if num[7]>count:
                print('value=',7)##000为arduino输出高电平
                num[7]=0
                return(7)
                break
        pass

def sendCode(c):
    pass
    out0 = Pin('P7', Pin.OUT_PP)#设置p_out为输出引脚
    out1 = Pin('P8', Pin.OUT_PP)#设置p_out为输出引脚
    out2 = Pin('P9', Pin.OUT_PP)#设置p_out为输出引脚    
    while(True):
        pass
        if c==0:           
            out0.low()#设置p_out引脚为低
            out1.low()
            out2.low()
            print('sent 0')
        elif c==1:
            out0.high()#设置p_out引脚为低
            out1.low()
            out2.low()
            print('sent 1')
        elif c==2:
            out0.low()#设置p_out引脚为低
            out1.high()
            out2.low()
            print('sent 2')
        elif c==3:
            out0.high()#设置p_out引脚为低
            out1.high()
            out2.low()
            print('sent 3')
        elif c==4:
            out0.low()#设置p_out引脚为低
            out1.low()
            out2.high()
            print('sent 4')
        elif c==5:
            out0.high()#设置p_out引脚为低
            out1.low()
            out2.high()
            print('sent 5')
        elif c==6:
            out0.low()#设置p_out引脚为低
            out1.high()
            out2.high()
            print('sent 6')
        elif c==7:
            out0.high()#设置p_out引脚为低
            out1.high()
            out2.high()
            print('sent 7')
        time.sleep(2000)
        break    
        
    
     

while(1):
    sendCode(2)
    while(0):
        print('had sent')
    
        
        

while(0):
    while(True):
        pass
        code=getCode()
        if code!=None:
            print('got the code, code is',code)
            break
        else:
            print('NO code')
            time.sleep(1000)
    while(True):
        pass
        #print('have code')
        
     

arduino:

#define code_a 2
#define code_b 3
#define code_c 4
int count=200;
int a=0;
int i=0;
int v[3]={0,0,0};
int num[8]={0,0,0,0,0,0,0,0};
void setup() {
    // put your setup code here, to run once:
    Serial.begin(9600);
    pinMode(code_a,INPUT);
    pinMode(code_b,INPUT);
    pinMode(code_c,INPUT);
}
      

void sentCode(int b) {
    pinMode(code_a,OUTPUT);
    pinMode(code_b,OUTPUT);
    pinMode(code_c,OUTPUT);
  if (b==7){
    
      digitalWrite(code_a,HIGH);
      digitalWrite(code_b,HIGH);
      digitalWrite(code_c,HIGH); } 
   else if (b==6){
      digitalWrite(code_a,LOW);
      digitalWrite(code_b,HIGH);
      digitalWrite(code_c,HIGH); } 
    else if (b==5){
      digitalWrite(code_a,HIGH);
      digitalWrite(code_b,LOW);
      digitalWrite(code_c,HIGH);}
    else if (b==4){
       digitalWrite(code_a,LOW);
      digitalWrite(code_b,LOW);
      digitalWrite(code_c,HIGH); }
    else if (b==3){
       digitalWrite(code_a,HIGH);
      digitalWrite(code_b,HIGH);
      digitalWrite(code_c,LOW); }
    else if (b==2){
       digitalWrite(code_a,LOW);
      digitalWrite(code_b,HIGH);
      digitalWrite(code_c,LOW); }
    else if (b==1){
       digitalWrite(code_a,HIGH);
      digitalWrite(code_b,LOW);
      digitalWrite(code_c,LOW);}
    else if (b==0){
       digitalWrite(code_a,LOW);
      digitalWrite(code_b,LOW);
      digitalWrite(code_c,LOW);  }
    delay(2000);
  }


int getCode(){
  v[0]=digitalRead(code_a);
  v[1]=digitalRead(code_b);
  v[2]=digitalRead(code_c);
  while(1){
    if (v[0]==0 && v[1]==0 && v[2]==0){
      num[0]++;
      if (num[0]>count){
          return(0);
          num[0]=0;
          break;
    } }
    else if (v[0]==0 && v[1]==0 && v[2]==1){
      num[1]++;
      if (num[1]>count){
          return(1);
          num[1]=0;
          break;
    } }
    else if (v[0]==0 && v[1]==1 && v[2]==0){
      num[2]++;
      if (num[2]>count){
          return(2);
          num[2]=0;
    } }
   else if (v[0]==0 && v[1]==1 && v[2]==1){
      num[3]++;
      if (num[3]>count){
          return(3);
          num[3]=0;
          break;
    } }
    else if (v[0]==1 && v[1]==0 && v[2]==0){
      num[4]++;
      if (num[4]>count){
          return(4);
          num[4]=0;
          break;
    } }
    else if (v[0]==1 && v[1]==0 && v[2]==1){
      num[5]++;
      if (num[5]>count){
          return(5);
          num[5]=0;
          break;
    } }
    else if (v[0]==1 && v[1]==1 && v[2]==0){
      num[6]++;
      if (num[6]>count){
          return(6);
          num[6]=0;
          break;
    } }
    else if (v[0]==1 && v[1]==1 && v[2]==1){
      num[7]++;
      if (num[7]>count){
          return(7);
          num[7]=0;
          break;
    } }
   
  }
}
 
void loop(){
  int co;
  co=getCode();
  if (co!=0){
    Serial.print("got code,the code is ");
    Serial.println(co);
  }
  else{Serial.println("No code");}
}


void loop1(){

      sentCode(2);
      while(1){;}

       
       while(0){      
        if(a>7){a=0;}
        Serial.print("a=");
        Serial.println(a);             
        sentCode(a);   
        a=a+1;
       
       }
       
}

猜你喜欢

转载自blog.csdn.net/qq_42807924/article/details/85160327