51MCU 发表于 2022-1-25 16:55:33

[实例1-Processing画框点灯]:Processing与RISC-Vduino编程实战(既面向对象又面向过程编程)

本帖最后由 51MCU 于 2022-1-25 17:21 编辑

      最近一直在思考,当今物联网时代,有没有一种既可以快速学习面向过程编程(C语言)知识,又能学习面向对象编程(Java语言)知识,而且还能把硬件电路玩起来的一种实战AIoT电子编程教程?回首过去十多年技术生涯,发现答案是:有的!      在国产化软硬件的时代趋势下,基于各位先人前辈实现的开源技术基础。我想有必要展示一下基于RISC-V国产化单片机硬件编程和基于Processing Java软件编程相结合的视觉互动交互电子艺术,仅此向各位同学,非电子计算机专业,但对电子感兴趣的爱好者介绍物联网时代,国产化硬件芯片电子艺术与视觉交互的魅力!使大家能够低门槛进入电子交互领域,将大家的灵感想法用视觉+电子呈现出来!分享给大家,让大家感受到科技的魅力!

      从本篇开始,我将通过几个小例子让各位同学快速地掌握Processing与RISC-Vduino编程实战知识(既面向对象又面向过程编程)。


实例1-Processing画框点灯:

任务:在Processing界面上画一个小矩形,当鼠标单击矩形内时,RISC-Vduino板载LED黄灯HelloWorld点亮;当鼠标单击矩形外时,RISC-Vduino板载的LED黄灯HelloWorld熄灭。

【1】硬件
1.1笔记本或PC电脑(建议系统Windows/Linux)[电脑应该都有吧]
1.2RISC-Vduino UNO Board [手头没有,某宝或PDD淘一块吧]
1.3USB 下载线
1.4USB mini通信线
https://www.risc-v1.com/data/attachment/forum/202201/21/143430w0gaa6lt0rff46gp.jpg
图1-1 RISC-Vduino UNO Board
https://www.risc-v1.com/data/attachment/forum/202201/21/144551uyeo8d8y1qr7dep8.jpg
图1-2 RISC-Vduino USB mini cable
https://www.risc-v1.com/data/attachment/forum/202201/21/144618cn4pidikjxy4nk5n.jpg
图1-3 RISC-Vduino USB Download cable
【2】软件
2.1.MRS(除了MounRiver Studio IDE,也可以选其他RISC-V IDE)

图2-1 RISC-V IDE-MRS(C语言)
2.2.Processing
https://www.risc-v1.com/data/attachment/forum/202201/21/143454skbb6rzzy8ykdeer.jpg
图2-2 Processing(Java语言)
【3】实战操作步骤
3.1首先RISC-Vduino连接USB下载线到电脑USB口,打开MRS下载好RISC-Vduino源码到RISC-Vduino板子。(见图3-1)

图3-1 下载RISC-Vduino源码
3.2上传开源代码,RISC-Vduino UNO Board开源代码:
/********************************** (C) COPYRIGHT *******************************
* File Name          : main.c
* Author             : www.RISC-Vduino.cc
* Version            : V1.0.0
* Date               : 2020/11/1
* Description      : Main program body.
*******************************************************************************/

#include "debug.h"
/*******************************************************************************
* Function Name: main
* Description    : Main program.
* Input          : None
* Return         : None
*******************************************************************************/
void HelloWorld_LED_Init(void)
{
      GPIO_InitTypeDefGPIO_InitStructure;
      RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
      GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
      GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
      GPIO_Init(GPIOA, &GPIO_InitStructure);
      GPIO_ResetBits(GPIOA,GPIO_Pin_1);
}
int main(void)
{
    u16 buttonState1;// read the input on ANALOG pin 6:(eg.RISC-Vduino UNO RC is Pin-GPIOA6)
    //u8 HIGH = 1;
    u8 LOW = 0;
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
    Delay_Init();
    USART_Printf_Init(9600);// initialize serial communication at 9600 bits per second:
    printf("SystemClk:%d\r\n",SystemCoreClock);
    printf("This is Processing SerialCommunication example\r\n");
    HelloWorld_LED_Init();
    // the while function runs over and over again forever
    while(1)
    {
      //Processing串口编程+RISC-Vduino串口通信(RISC-Vduino串口读取Processing下发的数据)
      if(USART_GetFlagStatus(USART1, USART_FLAG_RXNE) != RESET)
      {
printf("I am RISC-Vduino Board!\r\n");
         if(USART_ReceiveData(USART1) == 'a')
         {
             GPIO_ResetBits(GPIOA,GPIO_Pin_1);// CLOSE RISC-Vduino BOARD LED
         }
         if(USART_ReceiveData(USART1) == 'b')
         {
             GPIO_SetBits(GPIOA,GPIO_Pin_1); // OPEN RISC-Vduino BOARD LED
         }
      }
3.3然后接入USBmini线,电脑设备管理器中,查看RISC-Vduino板子的端口COM口。(见图3-2)

图3-2 查看RISC-Vduino板子串口为COM7
3.4 打开Processing中的COM口,进行Processing源代码编写运行。(见图3-3)

图3-3 Processing源代码运行
3.5 Processing开源代码:
import processing.serial.*;//导入serial库Serial port
Serial riscvduino_port; // Create object from Serial class 实例化一个Serial对象
String message;

void setup()
{
      //初始化RISC-Vduino端口,根据电脑系统为RISC-Vduino分配的端口号填写。
      riscvduino_port = new Serial(this, "COM7", 9600);//open windows Device COM7,from RISC-Vduino UNO Board connect!
      size(300,300);
}
void draw()
{
      rect(100,100,50,50);//绘制矩形
}

void mouseClicked()
{
      if((mouseX>=100)&(mouseX<=150)&mouseY>=100&(mouseY<=150))
      {
            //当鼠标在矩形区域内单击时,往RISC-Vduino串口发送小写字母a
            println("RISC-Vduino LED turn ON!");
            riscvduino_port.write("a");
      }
else
      {
            //当鼠标在矩形区域外单击时,往RISC-Vduino串口发送小写字母b
            println("RISC-Vduino LED turn OFF!");
            riscvduino_port.write("b");
      }
}
3.6 鼠标操作
单击Processing界面中方框内,可以看到RISC-Vduino板载LED黄灯HelloWorld点亮;
单击Processing界面中方框外,可以看到RISC-Vduino板载LED黄灯HelloWorld熄灭。
如图3-8所示,当单击白色矩形内时(见图3-4),Processing提示RISC-Vduino Board LED已经打开
(见图3-5),板载LED点亮(见图3-6).



图3-4 Processing代码执行效果图



图3-5 提示灯打开



图3-6 RISC-Vduino UNO板载LED点亮

当单击白色矩形外时,Processing提示RISC-Vduino Board LED已经关闭(见图3-7),板载LED熄灭(见图3-8).



图3-7 提示灯熄灭



图3-8 板载LED熄灭

[实例1-Processing画框点灯]:Processing与RISC-Vduino编程实战(既面向对象又面向过程编程)演示完毕!点击此处查看演示视频






苹果派 发表于 2022-1-27 21:05:36

向大佬学习 。。。

塞巴斯蒂安 发表于 2022-1-28 19:37:02

学习了,感谢分享   {:10_271:}

51MCU 发表于 2022-2-10 12:30:21

塞巴斯蒂安 发表于 2022-1-28 19:37
学习了,感谢分享

       面向过程的语言也称为结构化程序设计语言, 在面向过程程序设计中,问题被看作一系列需要完成的任务,函数则用于完成这些任务,解决问题的焦点集中于函数。 其概念最早由E.W.Dijikstra在1965年提出,是软件发展的一个重要里程碑。 它的主要观点是采用自顶向下、逐步求精的程序设计方法。"面向过程"(Procedure Oriented)是一种以过程为中心的编程思想。这些都是以什么正在发生为主要目标进行编程,不同于面向对象的是谁在受影响。与面向对象明显的不同就是封装、继承、类。

---面向过程(Procedure Oriented 简称PO :如C语言)

从名字可以看出它是注重过程的。当解决一个问题的时候,面向过程会把事情拆分成: 一个个函数和数据(用于方法的参数) 。然后按照一定的顺序,执行完这些方法(每个方法看作一个过程),等方法执行完了,事情就搞定了。

---面向对象(Object Oriented简称OO :如C++,JAVA等语言)

看名字它是注重对象的。当解决一个问题的时候,面向对象会把事物抽象成对象的概念,就是说这个问题里面有哪些对象,然后给对象赋一些属性和方法,然后让每个对象去执行自己的方法,问题得到解决。


「用3个例子说明两者的区别」
例子一:问题: 洗衣机里面放有脏衣服,怎么洗干净?

面向过程的解决方法:

1、执行加洗衣粉方法;

2、执行加水方法;

3、执行洗衣服方法;

4、执行清洗方法;

5、 执行烘干方法;

以上就是将解决这个问题的过程拆成一个个方法(是没有对象去调用的),通过一个个方法的执行来解决问题。

面向对象的解决方法:

1、我先弄出两个对象:“洗衣机”对象和“人”对象

2、针对对象“洗衣机”加入一些属性和方法:“洗衣服方法”“清洗方法”、“烘干方法”

3、针对对象“人”加入属性和方法:“加洗衣粉方法”、“加水方法”

4、然后执行

人.加洗衣粉

人.加水

洗衣机.洗衣服

洗衣机.清洗

洗衣机.烘干

解决同一个问题 ,面向对象编程就是先抽象出对象,然后用对象执行方法的方式解决问题。
例子二 : 打麻将例子 你 我 他

面向过程的解决方法: 打麻将 (你,我,他)

---解决问题
拆成一个动作,把数据丢进去

面向对象的解决方法:我.打麻将(你,他) or 你.打麻将(我,他) or 他.打麻将(我,你)

---解决问题
抽象出对象,对象执行动作 。



例子三:一个网上常见的五子棋例子

面向过程的解决方法就是首先分析问题的步骤:

1、开始游戏,
2、黑子先走,
3、绘制画面,
4、判断输赢,
5、轮到白子,
6、绘制画面,
7、判断输赢,
8、返回步骤2,
9、输出最后结果。

把上面每个步骤用不同的方法来实现。

面向对象的解决方法则是从另外的思路来解决问题。

整个五子棋可以分为
1、黑白双方,这两方的行为是一模一样的,
2、棋盘系统,负责绘制画面,
3、规则系统,负责判定诸如犯规、输赢等。
第一类对象(玩家对象)负责接受用户输入,并告知第二类对象(棋盘对象)棋子布局的变化,棋盘对象接收到了棋子的变化就要负责在屏幕上面显示出这种变化,同时利用第三类对象(规则系统)来对棋局进行判定。

可以明显地看出,面向对象是以功能来划分问题,而不是步骤。同样是绘制棋局,这样的行为在面向过程的设计中分散在了多个步骤中,很可能出现不同的绘制版本,因为通常设计人员会考虑到实际情况进行各种各样的简化。而面向对象的设计中,绘图只可能在棋盘对象中出现,从而保证了绘图的统一。

「面向过程与面向对象的优缺点」


用面向过程的方法写出来的程序是一份蛋炒饭,而用面向对象写出来的程序是一份盖浇饭。

蛋炒饭制作的细节不说了,最后的一道工序肯定是把米饭和鸡蛋混在一起炒匀。盖浇饭呢,则是把米饭和盖菜分别做好,你如果要一份红烧肉盖饭呢,就给你浇一份红烧肉;如果要一份青椒土豆盖浇饭,就给浇一份青椒土豆丝。

蛋炒饭的好处就是入味均匀,吃起来香。如果恰巧你不爱吃鸡蛋,只爱吃青菜的话,那么唯一的办法就是全部倒掉,重新做一份青菜炒饭了。盖浇饭就没这么多麻烦,你只需要把上面的盖菜拨掉,更换一份盖菜就可以了。盖浇饭的缺点是入味不均,可能没有蛋炒饭那么香。

到底是蛋炒饭好还是盖浇饭好呢?其实这类问题都很难回答,非要比个上下高低的话,就必须设定一个场景,否则只能说是各有所长。如果大家都不是美食家,没那么多讲究,那么从饭馆角度来讲的话,做盖浇饭显然比蛋炒饭更有优势,他可以组合出来任意多的组合,而且不会浪费。

盖浇饭的好处就是‘’菜”“饭”分离,从而提高了制作盖浇饭的灵活性。饭不满意就换饭,菜不满意换菜。用软件工程的专业术语就是”可维护性“比较好,”饭” 和”菜”的耦合度比较低。蛋炒饭将”蛋”“饭”搅和在一起,想换”蛋”“饭”中任何一种都很困难,耦合度很高,以至于”可维护性”比较差。软件工程追求的目标之一就是可维护性,可维护性主要表现在3个方面:可理解性、可测试性和可修改性。面向对象的好处之一就是显著的改善了软件系统的可维护性。

「总结来说」


面向过程

优点:性能比面向对象高,因为类调用时需要实例化,开销比较大,比较消耗资源;比如单片机、嵌入式开发、 Linux/Unix等一般采用面向过程开发,性能是最重要的因素。

缺点:没有面向对象易维护、易复用、易扩展

面向对象

优点:易维护、易复用、易扩展,由于面向对象有封装、继承、多态性的特性,可以设计出低耦合的系统,使系统 更加灵活、更加易于维护

缺点:性能比面向过程低


51MCU 发表于 2022-2-10 12:41:00

本帖最后由 51MCU 于 2022-2-10 12:42 编辑

51MCU 发表于 2022-2-10 12:30
面向过程的语言也称为结构化程序设计语言, 在面向过程程序设计中,问题被看作一系列需要完成的任 ...

面向过程:面向处理,更多的是从计算机角度思考,注重计算每一个步骤,程序更像是一本cpu操作手册。

面向对象:以日常生活的角度思考问题的解决,更接近人的思维方式,让人可以从更高的层面考虑系统的构建

以你请朋友吃饭为例:
面向对象的优点:

面向对象更加适合做应用的开发 --- 面向实体性编程为主,造飞机,造轮船

面向对象可以使你的代码更加优雅和紧凑

面向对象开发效率更高 ---- 将功能和数据进行隔离

面向对象代码复用度更高、可维护性更好

​面向对象是一种思维方式,它认为万事万物皆对象,程序是由多个对象协作共同完成功能的,所以


以后我们要从面向过程转向面向对象。以面向对象的方式考虑程序的构建。


面向对象的核心是:类和对象 [类是抽象的,在使用的时候通常会找到这个类的一个具体的存在,使用这个具体的存在。一个类可以找


到多个对象。对象是类的行为属性和数据属性进行具体化后的实例。]

[生活角度]

类:具有相同特征和行为的对象的集合,是一个概念

对象:客观存在的一切事物,是类的实例

类: 汽车 超级英雄 电脑 杯子

​对象: 红色的宝马 美国队长 桌上的mac pro 老王的黑色杯子

​类就相当于制造飞机时的图纸,用它来进行创建的飞机就相当于对象

[程序角度]

类:用户自定义的数据类型,是模板,不占用内存

对象:由类定义的变量,占用内存

类:

成员属性(成员变量)描述对象的静态特征,诸如,名字、身高体重

成员方法描述对象的动态特征,例如:吃饭、睡觉、打豆豆

类和对象之间的关系:


RISC-VMCU 发表于 2022-2-10 15:08:39

非常感谢使用RISC-Vduino UNO Board ,支持国产,支持中国芯!!!

孙悟空 发表于 2022-4-24 01:18:51

51MCU 发表于 2022-2-10 12:41
面向过程:面向处理,更多的是从计算机角度思考,注重计算每一个步骤,程序更像是一本cpu操作手册。

面 ...

面向对象的程序设计思想其实就是 约束全局变量(因为C语言使用了很多的全局变量来使各个功能模块之间数据共享,是模块化程序之间沟通的桥梁。因为模块化程序总是需要 “低耦合,高内聚”的编程理念来实现。)使用的一味良药,面向对象与面向过程都是一种思维方式的存在,并非孰优孰劣。
目前软件设计的发展来看, 面向对象的程序设计思想   在大型程序的设计和把控上有更多的优势!它能够把各个抽象的个体描绘得更加的直观,这样个体之间的相互联系也就顺理成章的表达和约束。
页: [1]
查看完整版本: [实例1-Processing画框点灯]:Processing与RISC-Vduino编程实战(既面向对象又面向过程编程)