如何将Arduino Uno当电脑用

如何将Arduino Uno当电脑用

0x00 准备工作

材料准备

1.电脑 x1

2.Arduino Uno 主控板 x1

3.Arduino Usb 连接线 x1

4.公对母、母对母、公对公杜邦线若干 *可选*

5.硬件若干(如蜂鸣器、显示器、按钮等) *可选*

注:电脑只作为操作系统编写使用,在没有其它硬件的情况下作为数据捕捉使用


环境搭建

首先,我们需要安装 Arduino IDE。

打开这个 网址 ,选择最新版右边适合自己电脑版本的下载,随后通过刚才下载的安装包安装 Arduino IDE。

然后打开安装好的 IDE ,右下角会有一个安装 USB 驱动的提示,点击安装就行了。

等待安装好后,用 USB 连接线将电脑和 Arduino 主板连接起来,然后点击上方选择框,选择 USB 接口(一般情况下只有 COM3 一个选项)。选择以后就会弹出一个窗口选择硬件版本,往下滑选择 Arduino Uno 就行。


0x01 制作原理

众所周知,Arduino 可以控制各种控件的运行,这说明它是有计算能力的。也就是说,它可以当做电脑使用。不过,在 Arduino IDE 里面可以看到,Arduino Uno 主板的存储控件只有 32768 Byte,而内存只有 2048 Byte ,这显然不可能装得下一个完整的操作系统。注:市面上最小的操作系统是 OSASK ,有大约 86 KB ,而它的作者还做过一个 HaryboteOS 的操作系统,除去驱动程序也有大约 35 KB ,所以,我们只能自己写一个操作系统了。

本文仅介绍最基本的电脑制作,只需要一个 Arduino Uno 主板即可,使用另一个电脑对它发送指令和捕捉数据。(在链接键盘和显示器以后,Arduino 可以单独作为电脑使用。如果有需要的读者可以自行查阅资料,链接其它硬件,并编写程序(无需写驱动程序,Arduino 自带了所有硬件的驱动程序)。


0x02 代码实现

以下是 Arduino 的基础代码:

1
2
3
4
5
6
7
8
void setup()//初始化函数
{

}
void loop()//类似主函数,程序将在这里运行
{

}

对于不用任何控件的主板,我们必须使用一个电脑对其发送命令和捕捉数据。而 Arduino IDE 自带了一个 Serial,正好满足我们的需求。

所以,我们先开启 Serial 端口,波特率为 9600 。在 Setup() 函数内加入代码:

1
Serial.begin(9600);

由于我们的命令需要截取前一部分的字符,确定命令名称,所以我们需要一个 substr 函数(求字符串的字串)。而 ArduinoC 里面并没有像 C++ 里面 string 自带的 substr,所以我们需要自行编写。

在程序的最前面加入以下代码:

1
2
3
4
5
6
7
8
9
10
11
12
#include<string.h>
//这里是C风格字符串,不是C++的string
void substr(const char str[],int start,int end,char ret[])
{//str是源字符串,start和end分别是区间的左右端点,ret是答案存储字符串(将答案存储在ret里面)
//注意!字符串下标从0开始
int i,j;
for(i=start,j=0;i<=end;i++,j++)
{
ret[j]=str[i];
}
ret[j]='\0';//字符串必须以'\0'结尾(不会输出)
}

因为 loop() 函数会一直循环执行,所以我们只需要在里面写单次的判断函数就行了。

首先在 loop() 函数里加入以下代码判断是否有数据输入了:

1
2
3
4
if(Serial.available()>0)
{

}

如果有,我们就要读取输入的数值,在刚才的 if 语句里面加入:

1
char ch=Serial.read();

那么如果 ch 是换行符的话,就表示一个命令结束了,否则就不是。所以我们还要判断一次,而命令没有结束的情况下,我们需要累计字符串;命令结束后就要运行命令,然后清空字符串。

所以在程序开头加入 char op[105];,把字符串只开 105 的大小的话,内存就会好很多,这是以输入命令的最大长度换内存。

然后我们在刚才的 if(Serial.available()>0) 里面加入以下语句:

1
2
3
4
5
6
7
8
if(ch=='\n')
{

}
else
{

}

我们先写命令没有结束的情况,在 else 里面加入以下代码:

1
2
3
int len=strlen(op);//由于插入字符后长度会变,我们需要先把长度保存下来
op[len]=ch;//往后面插入字符
op[len+1]='\0';//字符串必须以'\0'结尾

而命令结束后,我们就需要对命令进行解析了。

首先我们在里面定义两个局部变量:

1
2
char pos[105];//临时变量,存储op的字串
bool flg=false;//存储是否有已经配对的命令

现在,我们就可以为操作系统编写命令了。(以下展示两个命令):

1.prt 命令

这个命令的作用类似于 windows 终端的 echo,作用是输出字符串(例如 prt abc 的作用就是输出 abc

这个是第一个命令,我们就不需要判断是否有已经配对的命令了。

1
2
3
4
5
6
7
8
9
10
if(strlen(op)>=5)//首先必须长度要在4以上(<=5)
{
substr(op,0,3,pos);//取出前4位(还要判断是否有空格,prttt这种是不被允许的)
if(strcmp(pos,"prt ")==0)//匹配成功
{
flg=true;//匹配到了
substr(op,4,strlen(op)-1,pos);//取出后面的字符串
Serial.println(pos);//输出(println自带换行)
}
}

2.shutdown 命令

这个命令肯定不陌生,就是关机命令。

对于关机,我们只需要终止 loop() 函数就可以了。

注意!这个是第二个命令,需要判断是否已经有配对的命令

1
2
3
4
5
6
7
8
9
if((!flg)/*判断是否已配对*/&&strlen(op)==8)
{
substr(op,0,7,pos);
if(strcmp(pos,"shutdown")==0)//shutdown没有参数,不用判断空格
{
flg=true;
return;//终止loop()函数
}
}

在这个 if 语句的最后,我们还需要加上 sprintf(op,""); 来情况字符串。

最后,点击左上角的箭头(upload)上传代码,再按 Ctrl + Shift + M 打开控制台(注,使用搜狗输入法的话快捷键会冲突,此时可以点 Tools -> Serial Monitor 打开。

设置波特率为 9600 后,就可以在控制台里输入命令啦。


0x03 完整代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#include<string.h>
char op[105];

void substr(const char str[],int start,int end,char ret[])
{
int i,j;
for(i=start,j=0;i<=end;i++,j++)
{
ret[j]=str[i];
}
ret[j]='\0';
}

void setup()
{
Serial.begin(9600);
}

void loop()
{
if(Serial.available()>0)
{
char ch=Serial.read();
if(ch=='\n')
{
char pos[105];
bool flg=false;
//command
//Prt
if(strlen(op)>=5)
{
substr(op,0,3,pos);
if(strcmp(pos,"prt ")==0)
{
flg=true;
substr(op,4,strlen(op)-1,pos);
Serial.println(pos);
}
}
//Shutdown
if((!flg)&&strlen(op)==8)
{
substr(op,0,7,pos);
if(strcmp(pos,"shutdown")==0)
{
flg=true;
return;
}
}
//init
sprintf(op,"");
}
else
{
int len=strlen(op);
op[len]=ch;
op[len+1]='\0';
}
}
}

各位读者还可以加入其它命令(前提是代码不要超过 30000 Byte)。

对于其它硬件的控制,有兴趣的读者可以自行查阅资料和探索。

完结散花~



如何将Arduino Uno当电脑用
http://example.com/2023/08/06/如何将Arduino-Uno当电脑用/
作者
DijkstraPhoenix
发布于
2023年8月6日
许可协议