首页 > 其他分享 >基于ardinuo的仿生蚯蚓项目

基于ardinuo的仿生蚯蚓项目

时间:2024-02-05 11:15:31浏览次数:25  
标签:仿生 false int ardinuo void 蚯蚓 digitalWrite const true

0.基础知识

  1. 如果该引脚通过pinMode()设置为输出模式(OUTPUT),您可以通过digitalWrite()语句将该引脚设置为HIGH(5伏特)或LOW(0伏特/GND)。

1.舵机

arduino控制多个舵机,舵机库(Servo)的使用

https://blog.csdn.net/wengxiezhen2671/article/details/105346386

1.ESP8266+Blinker 控制两个舵机

#include <Servo.h> 
#define BLINKER_WIFI 
#include <Blinker.h> 

char auth[] = "c6a323f3c622"; 
char ssid[] = "Liu"; 
char pswd[] = "88888888"; 

BlinkerButton Button1("btn1"); 
BlinkerButton Button2("btn2"); 
Servo myservo1,myservo2;

BlinkerSlider Slider1("servo1_max");   //滑块1 控制舵机到滑块指定的角度
BlinkerSlider Slider2("servo2_max");   //滑块1 控制舵机到滑块指定的角度
int servo1_max,a1;
int servo2_max,a2;

void button1_callback(const String & state)    
{ 
  BLINKER_LOG("get button state: ", servo1_max);   
  myservo1.write(0);  
  Blinker.vibrate();  
} 
void button2_callback(const String & state)    
{ 
  BLINKER_LOG("get button state: ", servo2_max);   
  myservo2.write(0);  
  Blinker.vibrate();  
} 



void slider1_callback(int32_t value)//这个是滑块程序1
{
  servo1_max = value*2;
  a1= map(servo1_max,0,180,1000,2000); 
  myservo1.writeMicroseconds(a1);
  Blinker.vibrate();  //使手机震动

  Blinker.delay(1000);
  BLINKER_LOG("get slider value: ", value);
}
void slider2_callback(int32_t value)//这个是滑块程序2
{
  servo2_max = value*2;
  a2= map(servo2_max,0,180,1000,2000); 
  myservo2.writeMicroseconds(a2);
  Blinker.vibrate();  //使手机震动

  Blinker.delay(1000);
  BLINKER_LOG("get slider value: ", value);
}


void setup()    
{   
  Serial.begin(115200);    
  BLINKER_DEBUG.stream(Serial);    
  Blinker.begin(auth, ssid, pswd);//以上关于8266芯片的初始化   
  Button1.attach(button1_callback);   
  Button2.attach(button2_callback);    
  Slider1.attach(slider1_callback); 
  Slider2.attach(slider2_callback);
  myservo1.attach(5); //将舵机设置在D1引脚
  myservo2.attach(2); //将舵机设置在D4引脚                                                 
}

void loop() 
{   
    Blinker.run();   
}

2.直流电机

(1)ardinuo uno + 静态

const byte IN4 = 4;   
const byte IN3 = 3;   
const byte IN2 = 2;   
const byte IN1 = 1;

void Lshun(){
    digitalWrite(IN4,LOW);  
    digitalWrite(IN3,HIGH);
}

void LNI(){
    digitalWrite(IN3,LOW);  
    digitalWrite(IN4,HIGH);
}

void Rshun(){
    digitalWrite(IN2,LOW);  
    digitalWrite(IN1,HIGH);
}

void RNI(){
    digitalWrite(IN1,LOW);  
    digitalWrite(IN2,HIGH);
}
void setup() {
    pinMode(IN4,OUTPUT);      //声明电机控制引脚为数字引脚
    pinMode(IN3,OUTPUT);
    pinMode(IN2,OUTPUT);
    pinMode(IN1,OUTPUT);

}

void loop() {
   Lshun();
   //LNI();
    Rshun();---------------++
   //RNI();

}

(2)ESP8266 + 直流电机

#define BLINKER_WIFI
#include <Blinker.h>
char auth[] = "79f6a45ea586"; 
char ssid[] = "Liu"; 
char pswd[] = "88888888"; 
 
// 新建组件对象
BlinkerButton Button1("Lopen");
void L()                   //正转
{
    digitalWrite(5,HIGH);     //D1
    digitalWrite(4,LOW);     //D2
}
void LClose()               //关
{
    digitalWrite(5,LOW);     //D1
    digitalWrite(4,LOW);     //D2
} 
// 按下按键即会执行该函数
void button1_callback(const String & state) {
    BLINKER_LOG("get button state: ", state);
    if (state=="on") {
        L();
        // 反馈开关状态
        Button1.print("on");
    } else if(state=="off"){
        
        LClose() ;
        // 反馈开关状态
        Button1.print("off");
    }
}void button1_callback(const String & state) {
    BLINKER_LOG("get button state: ", state);
    digitalWrite(LED, !digitalRead(LED));
    if(state == "on")
    {
      digitalWrite(LED,LOW);
      Button1.print("on");
      }
    else if(state == "off")
    {
      digitalWrite(LED,HIGH);
      Button1.print("off");
    }
}

 
void setup() {
    // 初始化串口
    Serial.begin(115200);
    // 初始化有LED的IO
    pinMode(5, OUTPUT);
    digitalWrite(5, LOW);
    
    pinMode(4,OUTPUT);
    digitalWrite(4, LOW);
    // 初始化blinker
    Blinker.begin(auth, ssid, pswd);
    Button1.attach(button1_callback);
}
 
void loop() {
    Blinker.run();
}

直流电机调速

analogWrite(enA, 255);   
//For PWM maximum possible values are 0 to 255
//Arduino输出引脚9和3均启用PWM。
//在Arduino UNO控制器中,5号引脚和6号引脚的PWM频率为980Hz。在一些基于ATmega168和ATmega328的Arduino控制器中,analogWrite()函数支持以下引脚: 3, 5, 6, 9, 10, 11。![](/i/l/?n=24&i=blog/3388357/202402/3388357-20240205105254174-1836945799.png)

//在调用analogWrite()函数前,您无需使用pinMode()函数来设置该引脚。

3.压力传感器

image-20220209120444191

const int senpin = A0;
int value = 0;
void setup()
{
    //pinMode();
    Serial.begin(9600);
    
}
void loop()
{
    value = analogRead(senpin);
    Serial.println(value);
    value = map(value,0,10000);
    delay(1000);
}

4.湿度传感器

/*#define BLINKER_WIFI

#include <Blinker.h>
#include <DHT.h>

char auth[] = "0623a7f425da";
char ssid[] = "Liu";
char pswd[] = "88888888";

BlinkerNumber HUMI("humi");

#define DHTPIN A0

//#define DHTTYPE DHT11   // DHT 11
#define DHTTYPE DHT22   // DHT 22  (AM2302), AM2321
//#define DHTTYPE DHT21   // DHT 21 (AM2301)

DHT dht(DHTPIN, DHTTYPE);

float humi_read = 0;


void heartbeat()
{
    HUMI.print(humi_read);
    
}

void setup()
{
    Serial.begin(9600);
    BLINKER_DEBUG.stream(Serial);
    BLINKER_DEBUG.debugAll();
    pinMode(LED_BUILTIN, OUTPUT);
    digitalWrite(LED_BUILTIN, LOW);

    Blinker.begin(auth, ssid, pswd);
    Blinker.attachHeartbeat(heartbeat);
    dht.begin();
}

void loop()
{
    Blinker.run();

    float h = dht.readHumidity();
    
    if (isnan(h))
    {
        BLINKER_LOG("Failed to read from DHT sensor!");
    }
    else
    {
        BLINKER_LOG("Humidity: ", h, " %");
        humi_read = h;
    }

    Blinker.delay(2000);
}*/

#define soilPin A0
//存储中间值
int soilValue;
//定义土壤湿度
int soilMoisture;
void setup()
{
      Serial.begin(9600);
     //这句代码写不写都可
     //pinMode(soilPin, INPUT);
}
void loop()
{
    //读取土壤传感器上的电压值
    soilValue = analogRead(soilPin);
    //把电压值按照[0,1023]映射到[100,0]
    soilMoisture = map(soilValue,0,1023,100,0);
    //每隔一秒输出一次值
    delay(1000);
    Serial.print("soilMositure: ");
    Serial.print(soilMoisture);
    Serial.println("%");
}

5.Blinker点灯APP

(1)按键类型

  • 普通按键

每次按下该组件,都会发送值为tap的消息,如:

{"btn-abc":"tap"}
  • 开关按键

    按键组件本身会保存开关状态,默认为off,当按下时会发送值为on的消息,如:

{"btn-abc":"on"}

保存的状态为on时,按下会发送值为off的消息:  

{"btn-abc":"off"}

设备端可以发送指令改变当前按键的开关状态
  • 自定义

可以自定义按下按键发送的指令内容,如

{"btn-abc":"自定义的内容"}

当用户按下按键时,这些指令会经由中介服务器转发到设备,设备上运行的blinker支持库可以解析这些指令,并执行开发者自定义的动作。

(2)按键与状态反馈

数据组件

Number1.print(counter); 

按键组件(改变UI状态)

blinker提供了改写心跳包内容的方法,使用此方法可将一些数据放置在心跳包中返回,该方法可用于数据同步、状态查询。

blinker设备设计原则:设备端不主动发送数据,一切反馈都是由客户端(APP)发起。这样设计可以节约服务器资源,避免浪费。

示例程序:

#define BLINKER_WIFI
#include <Blinker.h>

char auth[] = "Your Device Secret Key";
char ssid[] = "Your WiFi network SSID or name";
char pswd[] = "Your WiFi network WPA password or WEP key";
// 新建组件对象
BlinkerButton Button1("btn-abc");

// 按下按键即会执行该函数
void button1_callback(const String & state) {
   BLINKER_LOG("get button state: ", state);
}

// 心跳包函数
void heartbeat() {
   Button1.icon("fas fa-lightbulb");
   Button1.color("#fddb00");
   Button1.text("关灯","打开啦");
   Button1.print("on");
}

void setup() {
   // 初始化串口
   Serial.begin(115200);
   // 初始化有LED的IO
   pinMode(LED_BUILTIN, OUTPUT);
   digitalWrite(LED_BUILTIN, HIGH);
   // 初始化blinker
   Blinker.begin(auth, ssid, pswd);
   Button1.attach(button1_callback);
   //注册一个心跳包
   Blinker.attachHeartbeat(heartbeat);
}

void loop() {
   Blinker.run();
}

使用以上示例,可在进入设备控制页面后,初始化界面上的UI。 

蚯蚓

ESP8266-1

/*************************************************************************************/
/*******************************  ESP8266 NodeMcu  ***********************************/
/***具体功能:                                                                       ***/
/* (1).控制直流电机1,钻头(Blinker实现开关)                                           ***/
/* (2).控制直流电机2,3,转向(Blinker实现每按一次转动某一小的角度)(控制每按一次电机通电200ms)**/
/*     包括正反转4个函数                                                              **/
/* (3).反馈湿度传感器的数值,(Blinker心跳包显示)                                       **/

#define BLINKER_WIFI 
#include <Blinker.h> 

//#define A0 A0     //湿度传感器模拟输出口
const int D0 = 16;   //钻头电机1
const int D1 = 5;    //钻头电机2
const int D2 = 4;    //上下转向1
const int D3 = 0;    //上下转向2
const int D4 = 2;    //左右转向1
const int D5 = 14;    //左右转向2


char auth[] = "0623a7f425da"; 
char ssid[] = "Liu"; 
char pswd[] = "88888888";

BlinkerButton ButtonZhuan("ZhuanSwitch"); 
BlinkerButton Button2_1("up"); 
BlinkerButton Button2_2("down");
BlinkerButton Button3_1("left");
BlinkerButton Button3_2("right");
BlinkerNumber HUMI("humi");           //定义湿度数据键名
//************************************//
int humi_read = 0;   //温湿度变量
//心跳函数
void heartbeat()
{
    HUMI.print(humi_read);    //点灯输出湿度
}
//**************** 转向  ********************//
void button2_1_callback(const String & state)
{
     if(state=="press"){
       up();     
      }
    else if(state == "pressup"){
       Stop();
      }
}
void button2_2_callback(const String & state)
{
     if(state=="press"){
       down();     
      }
    else if(state == "pressup"){
       Stop();
      }
}
void button3_1_callback(const String & state)
{
     if(state=="press"){
       left();     
      }
    else if(state == "pressup"){
       Stop();
      }
}
void button3_2_callback(const String & state)
{
     if(state=="press"){
       right();     
      }
    else if(state == "pressup"){
       Stop();
      }
}
//***************钻头*******************//
void buttonZhuan_callback(const String &state)
{
  BLINKER_LOG("get button state:",state);
  if(state == "on")
  {
       digitalWrite(D0,LOW);
       digitalWrite(D1,HIGH);
       ButtonZhuan.print("on");
  }
  else if(state == "off")
  {
       digitalWrite(D0,HIGH);
       digitalWrite(D1,LOW);
       ButtonZhuan.print("off"); 
  }
}

void up(){  //向上
  
  digitalWrite(D2,HIGH);
  digitalWrite(D3,LOW);
  Blinker.delay(100);
}
void down(){  //向下
 
  digitalWrite(D3,HIGH);
  digitalWrite(D2,LOW);
  Blinker.delay(100);
}
void right(){  //向右
 
  digitalWrite(D4,HIGH);
  digitalWrite(D5,LOW);
  Blinker.delay(100);
}
void left(){  //向左
 
  digitalWrite(D5,HIGH);
  digitalWrite(D4,LOW);
  Blinker.delay(100);
}

void Stop(){  //停止
 
  digitalWrite(D2,LOW);
  digitalWrite(D3,LOW);
  digitalWrite(D4,LOW);
  digitalWrite(D5,LOW);
  Blinker.delay(100);
}

void setup()    
{   
  Serial.begin(115200);    
  BLINKER_DEBUG.stream(Serial); 
  Blinker.attachHeartbeat(heartbeat);   //心跳包
   
  Blinker.begin(auth, ssid, pswd);//以上关于8266芯片的初始化  
  pinMode(A0,INPUT);
  pinMode(D0,OUTPUT);      digitalWrite(D0, LOW); 
  pinMode(D1,OUTPUT);      digitalWrite(D1, LOW);
  pinMode(D2,OUTPUT);      digitalWrite(D2, LOW);
  pinMode(D3,OUTPUT);      digitalWrite(D3, LOW);
  pinMode(D4,OUTPUT);      digitalWrite(D4, LOW);
  pinMode(D5,OUTPUT);      digitalWrite(D5, LOW);
  Button2_1.attach(button2_1_callback);     //向上组件
  Button2_2.attach(button2_2_callback);     //向下组件
  Button3_1.attach(button3_1_callback);     //向左组件
  Button3_2.attach(button3_2_callback);     //向右组件
  ButtonZhuan.attach(buttonZhuan_callback);     //钻头组件
                                                 
}

void loop() 
{   
    Blinker.run(); 
    float h0 = analogRead(A0);
    float h = map(h0,300,1024,100,0);
    BLINKER_LOG("Humidity: ", h, " %");       //打印输出调试信息
    humi_read = h;
    Blinker.delay(1000);  
}

ESP8266—2

第一版

/*********************************************************************************************/
/*********************************** ardinuo uno *********************************************/
/* 具体功能:                                                                           ****/
/*
   4个直流电机  
   (两个伸缩,两个膨胀)
*/
const int PINshen1_1 = 2;  
const int PINshen1_2 = 3;  
const int PINshen2_1 = 4;  
const int PINshen2_2 = 5;  
const int PINpeng1_1 = 6;  
const int PINpeng1_2 = 7;
const int PINpeng2_1 = 8;  
const int PINpeng2_2 = 9;


const int fsrpeng1_Pin = A0;     // A0 接口接压力传感器
const int fsrpeng2_Pin = A1;     // A1 接口接压力传感器

/************把压力传到A0,A1口************/

const int MinUp = 0 ,MaxDown = 0;
int peng1_Reading;
int peng2_Reading;

/********* 电机 **********/
void dianjizhuan(int pin1,int pin2)
{
    pinMode(pin1,HIGH);
    pinMode(pin2,LOW ); 
}

void dianjiStop()
{
    pinMode(2,LOW);
    pinMode(3,LOW);
    pinMode(4,LOW);
    pinMode(5,LOW);
    pinMode(6,LOW);
    pinMode(7,LOW);
    pinMode(8,LOW);
    pinMode(9,LOW);    
}

/********** 单元类 ***********/
class UNIT
{
public:
    int pin1,pin2,pin3,pin4;
    
    
    void pengzhangUp(int Reading);
    void pengzhangDown(int Reading);
    void shen();
    void suo(); 
};

/*************  膨胀 *************/
void UNIT::pengzhangUp(int Reading)
{
     if(Reading < MinUp)
     {
           dianjizhuan(pin1,pin2);
     }
     else
           dianjiStop();
}
void UNIT::pengzhangDown(int Reading)
{
     if(Reading > MaxDown)
     {
           dianjizhuan(pin2,pin1);
     }
     else
           dianjiStop();
}

/***********   伸缩   ****************/
void UNIT::shen()
{
    dianjizhuan(pin3,pin4);
    delay(5000);                 //电机转动5秒
}
void UNIT::suo()
{
    dianjizhuan(pin4,pin3);
    delay(5000);                //电机转动5秒
}
 


/************  初始化  ***************/
UNIT unit1,unit2;

void setup(void) 
{
  Serial.begin(9600);
  
  unit1.pin1 = PINshen1_1,unit1.pin2 =PINshen1_2,unit1.pin3 =PINpeng1_1,unit1.pin4 =PINpeng1_2;
  unit2.pin1 = PINshen2_1,unit2.pin2 =PINshen2_2,unit2.pin3 =PINpeng2_1,unit2.pin4 =PINpeng2_2;
  
}


void loop(void) 
{
  peng1_Reading = analogRead(fsrpeng1_Pin);
  peng2_Reading = analogRead(fsrpeng2_Pin);
  /*******   步骤一(第一单元膨胀机构膨胀)   *******/
  while(peng1_Reading>MinUp )  
         unit1.pengzhangUp(peng1_Reading);
  /*******   步骤二(第一单元伸缩机构伸)     *******/
  unit1.shen();
  /*******   步骤三(第一单元膨胀机构收缩)   *******/
  while(peng1_Reading>MaxDown )  
         unit1.pengzhangDown(peng1_Reading);
  /*******   步骤四(第二单元膨胀)   *******/
  while(peng2_Reading>MinUp)  
         unit2.pengzhangUp(peng2_Reading);
  /*******   步骤五(第一单元伸缩机构缩/第二单元伸缩机构伸)    ********/
  unit1.suo();
  unit2.shen();
  /*******   步骤六(第一单元膨胀机构膨胀)   *******/
  while(peng1_Reading>MinUp )  
         unit1.pengzhangUp(peng1_Reading);
  /*******   步骤七(第二单元膨胀机构收缩)   *******/
  while(peng2_Reading > MaxDown )  
         unit2.pengzhangDown(peng2_Reading);
  /*******   步骤八(第二单元伸缩机构缩)     *******/
  unit2.suo();
}







/*************压力数据传回终端************/
  /*Serial.print("Analog reading = ");
  Serial.print(fsrReading);
  if (fsrReading < 10) {
    Serial.println(" - No pressure");
  } else if (fsrReading < 200) {
    Serial.println(" - Light touch");
  } else if (fsrReading < 500) {
    Serial.println(" - Light squeeze");
  } else if (fsrReading < 800) {
    Serial.println(" - Medium squeeze");
  } else {
    Serial.println(" - Big squeeze");
  }
  delay(1000);
  */

第二版

/*********************************************************************************************/
/*********************************** ardinuo uno *********************************************/
/* 具体功能:                                                                           ****/
/*
   4个直流电机  
   (两个伸缩,两个膨胀)
*/
const int PINshen1_1 = 2;  
const int PINshen1_2 = 3;  
const int PINshen2_1 = 4;  
const int PINshen2_2 = 5;  
const int PINpeng1_1 = 6;  
const int PINpeng1_2 = 7;
const int PINpeng2_1 = 8;  
const int PINpeng2_2 = 9;


const int fsrpeng1_Pin = A0;     // A0 接口接压力传感器
const int fsrpeng2_Pin = A1;     // A1 接口接压力传感器

/************把压力传到A0,A1口************/

const int MinUp = 500 ,MaxDown = 0;
int peng1_Reading;
int peng2_Reading;

double tpinHIGH1,tpinHIGH2;          //记录第一、二单元膨胀时间(高电平时间)
double  tya;                   //记录压力传感器大于max的时间 

bool Step1=false,Step2=false,Step3=false,Step4=false,      //用来进行哪个步骤
     Step5=false,Step6=false,Step7=false,Step8=false;

//int steppeng = 1;        //当为奇数时即为第一单元膨胀,为偶数时为第二单元膨胀
//int stepshen = 1;        //当为奇数时即为第一单元伸缩,为偶数时为第二单元伸缩

//int PengNo1,PengNo2;

/********* 电机 **********/
void dianjizhuan(int pin1,int pin2)
{
    digitalWrite(pin1,HIGH);
    digitalWrite(pin2,LOW ); 
}

void dianjiStop()
{
    digitalWrite(2,LOW);
    digitalWrite(3,LOW);
    digitalWrite(4,LOW);
    digitalWrite(5,LOW);
    digitalWrite(6,LOW);
    digitalWrite(7,LOW);
    digitalWrite(8,LOW);
    digitalWrite(9,LOW);
    return false;    
}

/********** 单元类 ***********/
class UNIT
{
public:
    int pin1,pin2,pin3,pin4;
      
    void pengzhangUp(int Reading);
    void pengzhangDown(int Reading);
    void shen();
    void suo(); 
};

/*************  膨胀 *************/
void UNIT::pengzhangUp(int Reading)
{
     if(Reading < MinUp)
     {
           tya = 0;         //每次小于max之后都会先把 大于max的时间置为零
           dianjizhuan(pin1,pin2);
           delay(5);         //延迟5ms
           if(Step1 == true) 
               tpinHIGH1 +=1;    //记录膨胀电机高电平时间
           else
               tpinHIGH2 +=1;
     }
     else{     
          dianjiStop();
          delay(5);
          tya += 1;      //每次都会记录大于max的时间+5毫秒 
     }
     
     if(tya >= 200)      //就是持时间在1秒以上时,跳到下一个步骤,
     {
         dianjiStop();
         if(Step1 == true)                                    //    if( (stepshen++)%2 == 1 )      //奇数时即为第一单元伸缩,为偶数时为第二单元伸缩
              Step1 = false,Step2 = true ;
         else if(Step4 == true)
              Step4 = false,Step5 = true ; 
         else
              Step7 = false,Step8 = true ;          
     }     
}
/************** 收缩 *************/
void UNIT::pengzhangDown(int Reading)
{
     dianjizhuan(pin2,pin1);
     if(Step3 == true) 
     {  
        delay(tpinHIGH1);
        tpinHIGH1 = 0;
        Step3 = false,Step4 = true;
     }
     else
     {                       //其实是step7 = true
        delay(tpinHIGH2);
        tpinHIGH2 = 0;
        Step7 = false,Step8 = true;
     }
}

/***********   伸缩   ****************/
void UNIT::shen()
{
    dianjizhuan(pin3,pin4);
    delay(5000);                 //电机转动5秒
}
void UNIT::suo()
{
    dianjizhuan(pin4,pin3);
    delay(5000);                //电机转动5秒
}
 


/************  初始化  ***************/
UNIT unit1,unit2;

void setup(void) 
{
  Serial.begin(9600);
  pinMode(2,OUTPUT);
  pinMode(3,OUTPUT);
  pinMode(4,OUTPUT);
  pinMode(5,OUTPUT);
  pinMode(6,OUTPUT);
  pinMode(7,OUTPUT);
  pinMode(8,OUTPUT);
  pinMode(9,OUTPUT);
  unit1.pin1 = PINshen1_1,unit1.pin2 =PINshen1_2,unit1.pin3 =PINpeng1_1,unit1.pin4 =PINpeng1_2;
  unit2.pin1 = PINshen2_1,unit2.pin2 =PINshen2_2,unit2.pin3 =PINpeng2_1,unit2.pin4 =PINpeng2_2;
  
}


void loop(void) 
{
  peng1_Reading = analogRead(fsrpeng1_Pin);
  peng2_Reading = analogRead(fsrpeng2_Pin);
  /*******   步骤一(第一单元膨胀机构膨胀)   *******/
  if(Step1 == true)
  {
      unit1.pengzhangUp(peng1_Reading);
  }
  /*******   步骤二(第一单元伸缩机构伸)     *******/
  if(Step2 == true)
  {
      unit1.shen();
      Step2 == false,Step3 == true;
  }
  /*******   步骤三(第一单元膨胀机构收缩)   *******/
  if(Step3 == true)
  {  
      unit1.pengzhangDown(peng1_Reading);
  }
  /*******   步骤四(第二单元膨胀)   *******/
  if(Step4 == true)  
  {
      unit2.pengzhangUp(peng2_Reading);
  }
  /*******   步骤五(第一单元伸缩机构缩/第二单元伸缩机构伸)    ********/
  if(Step5 = true)
  {
      unit1.suo();
      unit2.shen();
      Step5 == false,Step6 == true;
  }
  /*******   步骤六(第一单元膨胀机构膨胀)   *******/
  if(Step6 == true)
  {  
      unit1.pengzhangUp(peng1_Reading);
  }
  /*******   步骤七(第二单元膨胀机构收缩)   *******/
  if(Step7 == true)
  {
      unit2.pengzhangDown(peng2_Reading);
  }
  /*******   步骤八(第二单元伸缩机构缩)     *******/
  if(Step8 == true)
  {
      unit2.suo();
      Step8 = false,Step1 = true;
  }
}

第三版

/*********************************************************************************************/
/*********************************** ardinuo uno *********************************************/
/* 具体功能:                                                                           ****/
/*
   4个直流电机  
   (两个伸缩,两个膨胀)
*/
const int PINshen1_1 = 2;  
const int PINshen1_2 = 3;  
const int PINshen2_1 = 4;  
const int PINshen2_2 = 5;  
const int PINpeng1_1 = 6;  
const int PINpeng1_2 = 7;
const int PINpeng2_1 = 8;  
const int PINpeng2_2 = 9;


const int fsrpeng1_Pin = A0;     // A0 接口接压力传感器
const int fsrpeng2_Pin = A1;     // A1 接口接压力传感器

/************把压力传到A0,A1口************/

const int MinUp = 400 ,MaxDown = 0;
int peng1_Reading=0;
int peng2_Reading=0;
int value,sensorPin;
//unsigned long time1;
//unsigned long time2;             //

int tpinHIGH1,tpinHIGH2;          //记录第一、二单元膨胀时间(高电平时间)
int tya;                   //记录压力传感器大于 MinUp 的时间 

bool Step1=true,Step2=false,Step3=false,Step4=false,      //用来进行哪个步骤
     Step5=false,Step6=false,Step7=false,Step8=false;

/********* 电机 **********/
void dianjizhuan(int pin1,int pin2)
{
    digitalWrite(pin1,HIGH);
    digitalWrite(pin2,LOW ); 
}

void dianjiStop()
{
    digitalWrite(2,LOW);
    digitalWrite(3,LOW);
    digitalWrite(4,LOW);
    digitalWrite(5,LOW);
    digitalWrite(6,LOW);
    digitalWrite(7,LOW);
    digitalWrite(8,LOW);
    digitalWrite(9,LOW);   
}

/********** 单元类 ***********/
class UNIT
{
public:
    int pin1,pin2,pin3,pin4;
       
    void pengzhangUp(int Reading);           //膨胀
    void pengzhangDown(int Reading);         //收缩
    void shen();
    void suo(); 
};

/*************  膨胀 *************/
void UNIT::pengzhangUp(int Reading)
{
     if(Reading < MinUp)
     {
           tya = 0;         //每次小于MinUp之后都会先把大于 MinUp 的时间置为零
           dianjizhuan(pin1,pin2);
           delay(5);         //延迟5ms
           if(Step1 == true)     //用来区分是第一个膨胀还是第二个膨胀
               tpinHIGH1 +=1;    //累计膨胀电机高电平时间
           else
               tpinHIGH2 +=1;
     }
     else{     
          dianjiStop();
          delay(5);
          tya += 1;      //每次都会记录大于max的时间+5毫秒 
     }
     
     if(tya >= 200)      //就是持时间在200ms*5=1秒以上时,跳到下一个步骤,
     {
         dianjiStop();
         if(Step1 == true)                                   //用来区分是第一个伸缩还是第二个伸缩
              Step1 = false,Step2 = true ;
         else if(Step4 == true)
              Step4 = false,Step5 = true ; 
         else
              Step7 = false,Step8 = true ;          
     }     
}
/************** 收缩 *************/
void UNIT::pengzhangDown(int Reading)
{
     dianjizhuan(pin2,pin1);
     if(Step3 == true)                              //此if.......else用来判断是第一个单元的膨胀机构收缩,还是第二个单元的膨胀机构收缩
     {  
        delay(tpinHIGH1*5);
        tpinHIGH1 = 0;
        Step3 = false,Step4 = true;
     }
     else
     {                 //其实是step7 = true
        delay(tpinHIGH2*5);
        tpinHIGH2 = 0;
        Step7 = false,Step8 = true;
     }
}

/***********   伸缩   ****************/
void UNIT::shen()
{
    dianjizhuan(pin3,pin4);
    delay(1000);                 //电机转动1秒
    dianjiStop();
}
void UNIT::suo()
{
    dianjizhuan(pin4,pin3);
    delay(1000);                //电机转动1秒
    dianjiStop();
}
 


/************  初始化  ***************/
UNIT unit1,unit2;

void setup(void) 
{
  Serial.begin(9600);
  pinMode(2,OUTPUT);
  pinMode(3,OUTPUT);
  pinMode(4,OUTPUT);
  pinMode(5,OUTPUT);
  pinMode(6,OUTPUT);
  pinMode(7,OUTPUT);
  pinMode(8,OUTPUT);
  pinMode(9,OUTPUT);
  unit1.pin1 = PINshen1_1,unit1.pin2 =PINshen1_2,unit1.pin3 =PINpeng1_1,unit1.pin4 =PINpeng1_2;
  unit2.pin1 = PINshen2_1,unit2.pin2 =PINshen2_2,unit2.pin3 =PINpeng2_1,unit2.pin4 =PINpeng2_2;
  
}


void loop(void) 
{
  peng1_Reading = analogRead(fsrpeng1_Pin);
  peng2_Reading = analogRead(fsrpeng2_Pin);
  
  Serial.println(peng1_Reading);
  //value = map(value, 0, 1023, 0, 255); //Map value 0-1023 to 0-255 (PWM)
  
  /*******   步骤一(第一单元膨胀机构膨胀)   *******/
  if(Step1 == true)
  {
      unit1.pengzhangUp(peng1_Reading);
      dianjiStop();
  }
  /*******   步骤二(第一单元伸缩机构伸)     *******/
  
  if(Step2 == true)
  {
      unit1.shen();
      Step2 = false,Step3 = true;
  }
  /*******   步骤三(第一单元膨胀机构收缩)   *******/
  if(Step3 == true)
  {  
      unit1.pengzhangDown(peng1_Reading);
  }
  /*******   步骤四(第二单元膨胀)   *******/

  if(Step4 == true)  
  {
      unit2.pengzhangUp(peng2_Reading);
  }
  /*******   步骤五(第一单元伸缩机构缩/第二单元伸缩机构伸)    ********/

  if(Step5 = true)
  {
      unit1.suo();
      unit2.shen();
      Step5 = false,Step6 = true;
  }
  /*******   步骤六(第一单元膨胀机构膨胀)   *******/

  if(Step6 == true)
  {  
      unit1.pengzhangUp(peng1_Reading);
  }
  /*******   步骤七(第二单元膨胀机构收缩)   *******/

  if(Step7 == true)
  {
      unit2.pengzhangDown(peng2_Reading);
  }
  /*******   步骤八(第二单元伸缩机构缩)     *******/

  if(Step8 == true)
  {
      unit2.suo();
      Step8 = false,Step1 = true;
  }
}

第四版

/*********************************************************************************************/
/*********************************** ardinuo uno *********************************************/
/* 具体功能:                                                                           ****/
/*
   4个直流电机  
   (两个伸缩,两个膨胀)
*/
const int PINshen1_1 = 2;  
const int PINshen1_2 = 3;  
const int PINshen2_1 = 4;  
const int PINshen2_2 = 5;  
const int PINpeng1_1 = 6;  
const int PINpeng1_2 = 7;
const int PINpeng2_1 = 8;  
const int PINpeng2_2 = 9;


const int fsrpeng1_Pin = A0;     // A0 接口接压力传感器
const int fsrpeng2_Pin = A1;     // A1 接口接压力传感器

/************把压力传到A0,A1口************/

const int MinUp = 400 ,MaxDown = 0;
int peng1_Reading=0;
int peng2_Reading=0;
int value,sensorPin;


unsigned long previousMillis = 0;
unsigned long currentMillis;

int tpinHIGH1,tpinHIGH2;          //记录第一、二单元膨胀时间(高电平时间)
int tya;                   //记录压力传感器大于 MinUp 的时间 

bool Step1=true,Step2=false,Step3=false,Step4=false,      //用来进行哪个步骤
     Step5=false,Step6=false,Step7=false,Step8=false;

/********* 电机 **********/
void dianjizhuan(int pin1,int pin2)
{
    digitalWrite(pin1,HIGH);
    digitalWrite(pin2,LOW ); 
}

void dianjiStop()
{
    digitalWrite(2,LOW);
    digitalWrite(3,LOW);
    digitalWrite(4,LOW);
    digitalWrite(5,LOW);
    digitalWrite(6,LOW);
    digitalWrite(7,LOW);
    digitalWrite(8,LOW);
    digitalWrite(9,LOW);   
}

/********** 单元类 ***********/
class UNIT
{
public:
    int pin1,pin2,pin3,pin4;
       
    void pengzhangUp(int Reading);           //膨胀
    void pengzhangDown(int Reading);         //收缩
    void shen();
    void suo(); 
};

/*************  膨胀 *************/
void UNIT::pengzhangUp(int Reading)
{
     if(Reading < MinUp)
     {
           tya = 0;         //每次小于MinUp之后都会先把大于 MinUp 的时间置为零
           dianjizhuan(pin1,pin2);
           
           if( currentMillis - previousMillis == 5   )//延迟5ms   delay(5); 
           {        
            previousMillis = currentMillis;
            if(Step1 == true)     //用来区分是第一个膨胀还是第二个膨胀
               tpinHIGH1 +=1;    //累计膨胀电机高电平时间
            else
               tpinHIGH2 +=1;
           }
           previousMillis = currentMillis;       
     }
     else{     
          dianjiStop();
          if( currentMillis - previousMillis == 5   )//延迟5ms   delay(5); 
          {
            previousMillis = currentMillis;      
            tya += 1;      //每次都会记录大于max的时间+5毫秒 
          }
          previousMillis = currentMillis;      
     }
     
     if(tya >= 200)      //就是持时间在200ms*5=1秒以上时,跳到下一个步骤,
     {
         dianjiStop();
         if(Step1 == true)                                   //用来区分是第一个伸缩还是第二个伸缩
              Step1 = false,Step2 = true ;
         else if(Step4 == true)
              Step4 = false,Step5 = true ; 
         else
              Step7 = false,Step8 = true ;          
     }     
}
/************** 收缩 *************/
void UNIT::pengzhangDown(int Reading)
{
     dianjizhuan(pin2,pin1);
     if(Step3 == true)                              //此if.......else用来判断是第一个单元的膨胀机构收缩,还是第二个单元的膨胀机构收缩
     {  
        if(currentMillis - previousMillis == tpinHIGH1*5)           //delay(tpinHIGH1*5);
        {
          tpinHIGH1 = 0;
          Step3 = false,Step4 = true;
        }
     }
     else
     {                 //其实是step7 = true
        if(currentMillis - previousMillis == tpinHIGH1*5)           //delay(tpinHIGH2*5);
        {
          tpinHIGH2 = 0;
          Step7 = false,Step8 = true;
        }
     }
     previousMillis = currentMillis;
}

/***********   伸缩   ****************/
void UNIT::shen()
{
    dianjizhuan(pin3,pin4);
    if(currentMillis - previousMillis == 1000)                 //delay(1000);   电机转动1秒
    {
      previousMillis = currentMillis;
      dianjiStop();
    }
}
void UNIT::suo()
{
    dianjizhuan(pin4,pin3);
    if(currentMillis - previousMillis == 1000)                 //delay(1000);   电机转动1秒
    {
      previousMillis = currentMillis;
      dianjiStop();
    }
}
 


/************  初始化  ***************/
UNIT unit1,unit2;

void setup(void) 
{
  Serial.begin(9600);
  pinMode(2,OUTPUT);
  pinMode(3,OUTPUT);
  pinMode(4,OUTPUT);
  pinMode(5,OUTPUT);
  pinMode(6,OUTPUT);
  pinMode(7,OUTPUT);
  pinMode(8,OUTPUT);
  pinMode(9,OUTPUT);
  unit1.pin1 = PINshen1_1,unit1.pin2 =PINshen1_2,unit1.pin3 =PINpeng1_1,unit1.pin4 =PINpeng1_2;
  unit2.pin1 = PINshen2_1,unit2.pin2 =PINshen2_2,unit2.pin3 =PINpeng2_1,unit2.pin4 =PINpeng2_2;
  
}


void loop(void) 
{
  peng1_Reading = analogRead(fsrpeng1_Pin);
  peng2_Reading = analogRead(fsrpeng2_Pin);
  
  currentMillis = millis();
  
  Serial.println(peng1_Reading);
  //value = map(value, 0, 1023, 0, 255); //Map value 0-1023 to 0-255 (PWM)
  
  /*******   步骤一(第一单元膨胀机构膨胀)   *******/
  if(Step1 == true)
  {
      unit1.pengzhangUp(peng1_Reading);
      dianjiStop();
  }
  /*******   步骤二(第一单元伸缩机构伸)     *******/
  
  if(Step2 == true)
  {
      unit1.shen();
      Step2 = false,Step3 = true;
  }
  /*******   步骤三(第一单元膨胀机构收缩)   *******/
  if(Step3 == true)
  {  
      unit1.pengzhangDown(peng1_Reading);
  }
  /*******   步骤四(第二单元膨胀)   *******/

  if(Step4 == true)  
  {
      unit2.pengzhangUp(peng2_Reading);
  }
  /*******   步骤五(第一单元伸缩机构缩/第二单元伸缩机构伸)    ********/

  if(Step5 = true)
  {
      unit1.suo();
      unit2.shen();
      Step5 = false,Step6 = true;
  }
  /*******   步骤六(第一单元膨胀机构膨胀)   *******/

  if(Step6 == true)
  {  
      unit1.pengzhangUp(peng1_Reading);
  }
  /*******   步骤七(第二单元膨胀机构收缩)   *******/

  if(Step7 == true)
  {
      unit2.pengzhangDown(peng2_Reading);
  }
  /*******   步骤八(第二单元伸缩机构缩)     *******/

  if(Step8 == true)
  {
      unit2.suo();
      Step8 = false,Step1 = true;
  }
}

终版

膨胀模块

void UNIT::pengzhangUp(int Reading)
{
     if(Reading < MinUp)
     {
           tiao:
           tya1 = 0;        //每次小于max之后都会先把 大于max的时间置为零
           dianjizhuan(pin1,pin2);
           delay(5);       //延迟5ms 
           tpinHIGH1 +=1;    //记录膨胀电机高电平时间
     }
     else{
          
          dianjiStop();
          delay(5);
          tya1 += 1;      //每次都会记录大于max的时间+5毫秒 
     }
     if(tyal >= 200)      //就是持时间在1秒以上时,跳到下一个步骤,
     {
         if( (stepshen++)%2 == 1 )      //奇数时即为第一单元伸缩,为偶数时为第二单元伸缩
              Step1 = false,Step2 = true ;
         else
              Step3 = false,Step4 = true ;
              
     }     
}

实验

步骤一:

/*********************************************************************************************/
/*********************************** ardinuo uno *********************************************/
/* 具体功能:                                                                           ****/
/*
   4个直流电机  
   (两个伸缩,两个膨胀)
   (膨胀机构中加两个压力传感器,防止超限)


   问题:previousMillis_1 的初始化
   1.最开始的时候初始化 weither == flase 一次,然后每次使用膨胀前再false 一次
*/
const int PINshen1_1 = 2;  
const int PINshen1_2 = 3;  
const int PINshen2_1 = 4;  
const int PINshen2_2 = 5;  
const int PINpeng1_1 = 6;  
const int PINpeng1_2 = 7;
const int PINpeng2_1 = 8;  
const int PINpeng2_2 = 9;

int currentMillis;              //读取当前时间

bool Whether1;
bool NO1_IForNO_1 = true;
bool NO1_IForNO_2 = true;
bool NO1_IForNO_3 = true;
bool NO1_IForNO_4 = true;
bool NO1_IForNO_5 = true;
bool NO1_IForNO_6 = true;
bool NO1_IForNO_7 = true;
bool NO1_IForNO_8 = true;

bool Step1=true,Step2=false,Step3=false,Step4=false,      //用来进行哪个步骤
     Step5=false,Step6=false,Step7=false,Step8=false;

/********* 电机 **********/
void dianjizhuan(int pin1,int pin2)
{
    digitalWrite(pin1,HIGH);
    digitalWrite(pin2,LOW ); 
}

void dianjiStop()
{
    digitalWrite(2,LOW);
    digitalWrite(3,LOW);
    digitalWrite(4,LOW);
    digitalWrite(5,LOW);
    digitalWrite(6,LOW);
    digitalWrite(7,LOW);
    digitalWrite(8,LOW);
    digitalWrite(9,LOW);   
}

/********** 单元类 ***********/
class UNIT
{
public:
    int pin1,pin2;                  //膨胀
    int pin3,pin4;                  //伸缩
    unsigned long pengzhang_time;    //膨胀电机的时间

    unsigned long shensuo_time;      //伸缩电机的时间
    
       
    void pengzhangUp(int currentMillis);  //膨胀(传入两个参数: 检测膨胀力度的传感器,检测齿条是否完全收进去的传感器)
    void pengzhangDown(int currentMillis);              //收缩(传入一个参数:检测齿条是否完全收进去的传感器)
    void shen(int currentMillis);
    void suo(int currentMillis); 
    
};

/*************  膨胀 *************/
void UNIT::pengzhangUp(int currentMillis)
{
    pengzhang_time = currentMillis;   //把开始使用电机的时间记录下来
    dianjizhuan(pin1,pin2);
}
/************** 收缩 *************/
void UNIT::pengzhangDown(int currentMillis)
{
    pengzhang_time = currentMillis;   //把开始使用电机的时间记录下来
    dianjizhuan(pin2,pin1);
}

/***********   伸缩   ****************/
void UNIT::shen(int currentMillis)
{
  
   shensuo_time = currentMillis;   //把开始使用电机的时间记录下来
   dianjizhuan(pin3,pin4);
}
void UNIT::suo(int currentMillis)
{
   shensuo_time = currentMillis;   //把开始使用电机的时间记录下来
   dianjizhuan(pin4,pin3);
}
 


/************  初始化  ***************/
UNIT unit1,unit2;

void setup(void) 
{
  Serial.begin(9600);
  pinMode(2,OUTPUT);
  pinMode(3,OUTPUT);
  pinMode(4,OUTPUT);
  pinMode(5,OUTPUT);
  pinMode(6,OUTPUT);
  pinMode(7,OUTPUT);
  pinMode(8,OUTPUT);
  pinMode(9,OUTPUT);
  unit1.pin1 = PINshen1_1,unit1.pin2 =PINshen1_2,unit1.pin3 =PINpeng1_1,unit1.pin4 =PINpeng1_2;
  unit2.pin1 = PINshen2_1,unit2.pin2 =PINshen2_2,unit2.pin3 =PINpeng2_1,unit2.pin4 =PINpeng2_2;
  Whether1 = false;
  
}


void loop(void) 
{
  
  /*******   步骤一(第一单元膨胀机构膨胀)   *******/
  if(Step1 == true)
  {

      Serial.println("步骤一(第一单元膨胀机构膨胀)");
      currentMillis = millis();          //读取当前的时间
      if(NO1_IForNO_1 == true)
      {
        unit1.pengzhangUp(currentMillis);
        NO1_IForNO_1 = false;
        NO1_IForNO_2 = true;
      }
      if(currentMillis - unit1.pengzhang_time >= 1000)
      {
          dianjiStop();
          Step1 = false;
          Step2 = true;        
      }
      
  }
  /*******   步骤二(第一单元伸缩机构伸)     *******/
  
  if(Step2 == true)
  {
      Serial.println("步骤二(第一单元伸缩机构伸)");
      
      currentMillis = millis();          //读取当前的时间
      if(NO1_IForNO_2 == true)
      {
        unit1.shen(currentMillis);
        NO1_IForNO_2 = false;
        NO1_IForNO_3 = true;
      }
      if(currentMillis - unit1.shensuo_time >= 1000)
      {
          dianjiStop();
          Step2 = false;
          Step3 = true;        
      }
      
  }
  /*******   步骤三(第一单元膨胀机构收缩)   *******/
  if(Step3 == true)
  {  

      Serial.println("步骤三(第一单元膨胀机构收缩)");
      currentMillis = millis();          //读取当前的时间
      if(NO1_IForNO_3 == true)
      {
        unit1.pengzhangDown(currentMillis);
        NO1_IForNO_3 = false;
        NO1_IForNO_4 = true;
      }
      if(currentMillis - unit1.pengzhang_time >= 1000)
      {
          dianjiStop();
          Step3 = false;
          Step4 = true;        
      }
  }
  /*******   步骤四(第二单元膨胀)   *******/

  if(Step4 == true)  
  {
      Serial.println("步骤四(第二单元膨胀)");
      currentMillis = millis();          //读取当前的时间
      if(NO1_IForNO_4 == true)
      {
        unit2.pengzhangUp(currentMillis);
        NO1_IForNO_4= false;
        NO1_IForNO_5 = true;
      }
      if(currentMillis - unit2.pengzhang_time >= 1000)
      {
          dianjiStop();
          Step4 = false;
          Step5 = true;        
      }
  }
  /*******   步骤五(第一单元伸缩机构缩/第二单元伸缩机构伸)    ********/

  if(Step5 == true)
  {
      Serial.println("步骤五(第一单元伸缩机构缩/第二单元伸缩机构伸)");
      currentMillis = millis();          //读取当前的时间
      if(NO1_IForNO_5 == true)
      {
        unit1.suo(currentMillis);
        unit2.shen(currentMillis);
        NO1_IForNO_5 = false;
        NO1_IForNO_6 = true;
      }
      if(currentMillis - unit1.shensuo_time >= 1000)
      {
          dianjiStop();
          Step5 = false;
          Step6 = true;        
      }
  }
  /*******   步骤六(第一单元膨胀机构膨胀)   *******/

  if(Step6 == true)
  {  
      Serial.println("步骤六(第一单元膨胀机构膨胀)");
      currentMillis = millis();          //读取当前的时间
      if(NO1_IForNO_6 == true)
      {
        unit1.pengzhangUp(currentMillis);
        NO1_IForNO_6 = false;
        NO1_IForNO_7 = true;
      }
      if(currentMillis - unit1.pengzhang_time >= 1000)
      {
          dianjiStop();
          Step6 = false;
          Step7 = true;        
      }

  }
  /*******   步骤七(第二单元膨胀机构收缩)   *******/

  if(Step7 == true)
  {
      Serial.println("步骤七(第二单元膨胀机构收缩)");
      currentMillis = millis();          //读取当前的时间
      if(NO1_IForNO_7 == true)
      {
        unit2.pengzhangDown(currentMillis);
        NO1_IForNO_7 = false;
        NO1_IForNO_8 = true;
      }
      if(currentMillis - unit2.pengzhang_time >= 1000)
      {
          dianjiStop();
          Step7 = false;
          Step8 = true;        
      }    
  }
  /*******   步骤八(第二单元伸缩机构缩)     *******/

  if(Step8 == true)
  {
      Serial.println("步骤八(第二单元伸缩机构缩)");
      currentMillis = millis();          //读取当前的时间
      if(NO1_IForNO_8 == true)
      {
       
        unit2.suo(currentMillis);
        NO1_IForNO_8 = false;
        NO1_IForNO_1 = true;
      }
      
      if(currentMillis - unit2.shensuo_time >= 1000)
      {
        Serial.println("**************************************)");
          dianjiStop();
          Step8 = false;
          Step1 = true;        
      }
      
  }

   
}

步骤二:


7.串口通信

Serial.begin(); //开启串行通信接口并设置通信波特率

    Serial.end();    //关闭通信串口

    Serial.available();//判断串口缓冲器是否有数据装入

    Serial.read();    //读取串口数据

    Serial.peek();    //返回下一字节(字符)输入数据,但不删除它

    Serial.flush();    //清空串口缓存

    Serial.print();    //写入字符串数据到串口

    Serial.println();   //写入字符串数据+换行到串口

    Serial.write();     //写入二进制数据到串口

    Serial.SerialEvent();//read时触发的事件函数

    Serial.readBytes(buffer,length);//读取固定长度的二进制流

    Serial.println(incomingByte, DEC);//打印接到数据十进制表示的ascii码。  HEX 十六进制表示

标签:仿生,false,int,ardinuo,void,蚯蚓,digitalWrite,const,true
From: https://www.cnblogs.com/Lctrl/p/18007564

相关文章

  • NOI 2017 蚯蚓排队 题解
    Meaning给定一些数字,对它们进行首尾相接和断开两种操作。对于每次询问,求对于每个数字,其后长度一定的数字串在给定数字串中出现的次数,并给出这些次数之积。Soultion对于每次首尾相接或断开的操作,如果直接对断点或合点两侧的整个数字串进行操作,时间复杂度不可接受。由于每次查询......
  • 【专题】2023年中国仿生机器人产业全景报告PDF合集分享(附原数据表)
    原文链接:https://tecdat.cn/?p=34144原文出处:拓端数据部落公众号仿生机器人作为一类结合了仿生学原理的机器人,具备自主决策和规划行动的能力,正逐渐进入大众视野。它们的核心技术要素包括感知与认知技术、运动与控制技术、人机交互技术和自主决策技术。阅读原文,获取专题报告合集......
  • 《安富莱嵌入式周报》第312期:开源磁场照相机,仿生神经元PCB,开源无线耳机,手机系统PalmOS
    更新一期视频教程:BSP视频教程第26期:CAN/CANFD/CANopen专题,CANFD整个运行机制精讲,图文并茂,配合综合实战演练(2023-05-15)视频版:https://www.bilibili.com/video/BV1zL41167Ti 1、基于开放系统组装协议OSAP实现的简化硬件设计项目软件开源:https://github.com/modular-things/modular-t......
  • 小米宣布科技战略升级,新一代折叠屏、仿生机器人、端侧大模型等重磅亮相
    8月14日晚,小米新品发布会在北京国家会议中心举行,小米集团创始人、董事长兼CEO雷军第四次做年度公开演讲,分享了他在过去36年中,几次关键成长的经历和感悟。在发布会上,雷军正式宣布小米科技战略升级,并公布了小米的科技理念:选择对人类文明有长期价值的技术领域,坚持长期持续投入。本次......
  • 蚯蚓排队
    蚯蚓排队思路上还是比较水的(然而扬言1h\(AC\)的某人被许多小问题d了半天),操作一,二对于每个队伍都直接进行维护就好,关键是操作三(明明就是取个子串非不说人话)。Analysis简化题意:给定一串字符(蚯蚓),三种操作:\(opt=1\)让第\(i\)与\(j\)个字符合并。\(opt=2\)让第\(i\)与......
  • 2自由度并联仿生腿的制作
    1.运动功能说明    本文实例将实现2自由度并联仿生腿模组运动起来,模拟实现狗腿行走的动作。2.结构说明    2自由度并联仿生腿模组是由两个舵机驱动的,它的所有动作都将在两个舵机的配合运动下实现。3.运动原理说明    2自由度并联仿生腿模组运动的点位如下图......
  • 《安富莱嵌入式周报》第312期:开源磁场照相机,仿生神经元PCB,开源无线耳机,手机系统PalmOS
    更新一期视频教程:BSP视频教程第26期:CAN/CANFD/CANopen专题,CANFD整个运行机制精讲,图文并茂,配合综合实战演练(2023-05-15)https://www.armbbs.cn/forum.php?mod=viewthread&tid=119189视频版:https://www.bilibili.com/video/BV1zL41167Ti 1、基于开放系统组装协议OSAP实现的简化硬件设......
  • 硅基仿生业务全面 Serverless 容器化,14万+问答库助力糖尿病科普
    作者:宁佑章(硅基仿生科技)、元毅(阿里云容器服务)“使用阿里云容器服务Knative,解决了开发迭代慢的问题,加速了深度学习模型的性能提升;同时提供了弹性可伸缩的资源配置,满足网络服......
  • 硅基仿生业务全面 Serverless 容器化,14万+问答库助力糖尿病科普
    作者:宁佑章(硅基仿生科技)、元毅(阿里云容器服务)“使用阿里云容器服务Knative,解决了开发迭代慢的问题,加速了深度学习模型的性能提升;同时提供了弹性可伸缩的资源配置,满足网络......
  • 创建仿生算法来寻找大脑癫痫灶
    发作间期的尖峰。a)典型波形。b)在时间t=0时传感器上的颜色编码活动分布示例,对应于峰值。它显示了一个明确的偶极子模式,表明符号变化区域中的癫痫灶。莫斯科国立高等经......