• 回答数

    2

  • 浏览数

    224

petite妮妮崽
首页 > 期刊论文 > 树莓派要怎么写毕业论文

2个回答 默认排序
  • 默认排序
  • 按时间排序

谁是小小

已采纳

树莓派的功能用途无线热点、机械假肢、简易自制笔记本、WiFi小车、远程发送微博等。

1、无线热点。

这大概是地球人拿来干得最多的一件——插上网线和USB无线网卡,配置之后就可以作为一个无线热点。

2、机械假肢。

MIT Media Lab的研究员把它作为机械假肢的控制器。

3、简易自制笔记本。

把树莓派跟LCD液晶面板连上,再加上鼠标键盘和电源,找一个漂亮的壳子套上,就变成一个简易自制笔记本了。

4、WiFi小车。

IBM的一个工程师把它安在一个模型小车上,然后通过WiFi信号来控制小车的行动。

5、远程发送微博。

气象爱好者把它绑在检测气球上,还用它在平流层发了一条微博。

6、控制车库门开关。

还有拿树莓派控制车库门,再结合Siri遥控车库开关的达人。

7、监控拍摄。

最后还有接上摄像头,连上WiFi作为小型拍摄设备,体型小,易隐藏。

8、备份邮件。

我使用树莓派的最重要的功能之一就是备份我的邮件。我使用一个叫作getmail的软件来检查每份使用POP或者IMAP协议的邮件,定时查看各个账号的邮件。然后把邮件保存到一个mbox文件,这个文件可以在任何时候被复制到另一台电脑上做长期的邮件归档。

9、搭建个人RSS阅读器。

我最近发现了miniflux,一个自托管的基于网络的RSS客户端,可以安装到树莓派上。和许多人一样,当谷歌宣布将在7月1号关闭Google Reader后我也开始将个人数据迁移出来。我使用了一阵子rss2email,让它把RSS每一条目都发送到我的邮箱中。

但其实我不是很喜欢这个方法,于是我花了点时间寻找Google Reader替代品并试过了rss2email之后找到了miniflux。在树莓派上安装miniflux十分简单,你只需要提前安装PHP和一个web服务器软件就好了,比如nginx或者Apache。

10、搭建网站。

树莓派一个很明显的用处就是作为网站的后台服务器。我曾这么用过一阵子,而且很快就要重新这么干。树莓派有足够的能力来处理静态网站,一些web框架也不成问题。我就在上面搭建过一个Flask框架,我甚至听说有的人直接在树莓派搭建了个Wordpress。

11、家用网络存储。

只消耗很低的电量,树莓派就可以成为一个完美的NAS(网络连接式存储)。之前我把一个500GB的笔记本硬盘连接到树莓派上,还在上面安装了一个操作系统。

我可以在上面存放许多需要在不同电脑间传输的文件。然后通过SFTP来连接,然后在家里的任何机器上都可以访问(即使不在家,只要路由设定对了也不成问题)。你也可以在派上安装Samba,这样Mac和PC都可以更容易地存取。

12、站点监控。

树莓派的另一个用处就是用来检测对我来说很重要的网站。我写了个Python脚本并定时运行,确保这些网站回复一个200状态码(这意味着一切正常)。如果脚本判断出网站出了问题或者无法访问,会把这个事件的总体情况发邮件给我。我使用的Python模块是Requests,而发邮件的模块则是smtplib。

13、事件提醒。

我让树莓派把我需要记住的重要事件发邮件给我。之前我用的是谷歌日历,但我只在简单事件才用它。所以我用树莓派代替了它,一段定时任务的Python脚本就够了。我设定了要记住的日期、时间和消息,这些参数会传给我的Python脚本,到了那一天它就会把消息发送到我的邮箱,提醒我当天的事件。

14、家庭相册。

我的树莓派同时还支持着一个私人网站,网站放着我所有的家庭照片。我设立了验证信息所以只有我希望让他们看到的人才能进入网站。这比你的Facebook相册要靠谱多了,因为脸书上面你的账户有可能被删除,而且照片会被陌生人偶然看到。很简单,就是用PHP获取树莓派上一个文件夹里的照片而已。

15、点唱机。

上面提到我把派当作一个网络存储器,所以我所有的音乐也都在上面。我的派上接了个立体扬声器,然后使用mpg123在树莓派的命令行里播放音乐。虽然有很多其他的mp3播放器,图形界面的也有,但我还是选择mpg123,因为它简单好用,安装也很方便。

173 评论

黑玫瑰1111

关于按键,在DVK521上为:

我又从一份数据手册中看到,PI7,PI8,PI9是没有外部中断功能的。如下图所示:

还好,目前的按键是通过短接帽来连接PI7 PI9的,那么可以将短接帽拿掉,使用杜邦线连接PI10 PI12。

现在我将Key2连接到PI10上。那么KEY2的中断引脚为EINT22。

配置sys_config.fex文件:

现在使用的树莓派A20,是一个双核A7的芯片,而这个属于SMP架构,中断处理方式也已经和原先的理念大有不同。所以还是要知道关于linux的中断原理,可以从网络中获取相关历史性技术知识。

从A20的数据手册中,可以看到外部中断数到了EINT31。也就是说PIO中断功能有32个。

下面列出的API函数是在 \linux-sunxi\arch\arm\plat-sunxi\Sys_config.c中。

1.gpio_request_ex(),获取sys_config.fex中设置的中断IO口。 2.gpio_set_one_pin_io_status(),设置为输入状态。 3.gpio_set_one_pin_pull(),设置输入引脚的上下拉状态。 4.request_irq()注册中断函数。

request_irq()函数: 第一个参数为SW_INT_IRQNO_PIO,表示是外部端口的中断号。 第二个参数为中断处理函数名。 第三个参数为中断方式,如IRQ_TYPE_EDGE_RISING,上升沿触发,而IRQ_TYPE_EDGE_FALLING则是下降沿触发,IRQF_SHARED为共享。 第四个参数为中断名。 第五个参数为中断传递的数据。

1.获取IO中断源信息 由于内核使用的是虚拟地址寻址硬件地址,获取中断源就需要将IO硬件地址空间映射到虚拟地址上。可以使用ioremap(PIO_BASE_ADDRESS, PIO_RANGE_SIZE)进行映射。

2.屏蔽中断源 a.读取中断源寄存器的状态,可以使用readl(映射的IO地址 + PIO_INT_STAT_OFFSET); b.判断对应的中断,使用writel(reg_val&(1<<(CTP_IRQ_NO)),映射的IO地址 + PIO_INT_STAT_OFFSET);清除状态位。

写到这里,本应该很顺利,可是,在驱动程序加载进内核的时候,明显是报错。错误我就不贴出来了,可是我可以将中断信息附上:

从这里,可以看出来,PIO中断号60已经注册进内核了。我们现在使用的一个IO中断是被包含在里面的。所以,需要在内核中找到sunxi-gpio是怎么去注册中断,而我们就需要将我们的中断程序内容附加到已经注册的中断上去。

在 marsboard\marsboard-a20-linux-sdk-v1.2\linux-sunxi\drivers\gpio\Gpio-sunxi.c中我们可以找到函数:

里面最重要的函数是:

最终调用的是:

然而,它又被赋值了:

在一定程度的意义上,gpio-sunxi.c已经将中断基本处理做好了,我们要做的只是和它共享中断。

sys_config.fex文件配置如下:

从上面的实验中,已经发现在request_irq中设置边沿等等触发,在安装ko文件的时候,都会报错,从这里看出,在共享中断的时候,是不允许设置其他的内容的。那么,只能去找A20寄存器中关于io口中断的设置。在这些设置已经设置好的情况下,中断应该就能响应了。这里贴出一个比较简单的驱动程序:

int main(int argc,char *argv[]) { int fd; int val; fd = open("/dev/key_device",O_RDWR); if(fd < 0){ printf("---open file error----\r\n"); return -1; }

}

ifeq ($(KERNELRELEASE),) KERNEL_DIR=/home/wityuan/Downloads/MarsBoard-A20-Linux-SDK-V1.2/linux-sunxi PWD=$(shell pwd)

modules: $(MAKE) -C $(KERNEL_DIR) M=$(PWD) modules arm-linux-gnueabihf-gcc -o key key.c

modules_install: $(MAKE) -C $(KERNEL_DIR) M=$(PWD) modules_install clean: rm -rf *.ko *.o .tmp_versions .mod.c modules.order Module.symvers . .cmd else obj-m:=key.o endif

root@marsboard:~# ./key_test ---script.bin key get ok,value:1---- key irq Interrupt ==IRQ_EINT22= key irq Interrupt ==IRQ_EINT22= key irq Interrupt ==IRQ_EINT22= key irq Interrupt ==IRQ_EINT22= key irq Interrupt ==IRQ_EINT22= key irq Interrupt ==IRQ_EINT22= key irq Interrupt ==IRQ_EINT22= key irq Interrupt ==IRQ_EINT22= key irq Interrupt ==IRQ_EINT22= ^Ckey irq Interrupt Other Interrupt ----key close----

root@marsboard:~# root@marsboard:~#

/* EINT type PIO controller registers */

/* EINT type defines */

static int int_cfg_addr[] = {PIO_INT_CFG0_OFFSET, PIO_INT_CFG1_OFFSET, PIO_INT_CFG2_OFFSET, PIO_INT_CFG3_OFFSET};

/* Setup GPIO irq mode (FALLING, RISING, BOTH, etc */

})

/* Enable GPIO interrupt for pin */

})

/* Disable GPIO interrupt for pin */

})

/* Set GPIO pin mode (input, output, etc) / / GPIO port has 4 cfg 32bit registers (8 pins each) / / First port cfg register addr = port_num * 0x24 */

})

static script_gpio_set_t info; static unsigned key_handler1; static unsigned key_handler2;

static struct class *key_class; static struct device *key_device; static unsigned int key_major;

static unsigned int key_value;

static void *__iomem gpio_addr = NULL;

static int key_open(struct inode *inode, struct file *filp); static ssize_t key_read (struct file *, char __user *, size_t, loff_t *); static ssize_t key_write (struct file *filp, const char __user *buf, size_t len, loff_t *off); static int key_close(struct inode *inode, struct file *filp);

struct file_operations key_operations = { .owner = THIS_MODULE, .open = key_open, .read = key_read, .write = key_write, .release = key_close, };

struct key_str{ char *name; int val; };

struct key_str g_key_str[2]={{"key1",0x1},{"key2",2}};

static irqreturn_t key_irq_handler1(int irq, void *dev_id) { int err; int reg_val = 0; int ret_val = 0;

}

static irqreturn_t key_irq_handler2(int irq, void *dev_id) {

}

static ssize_t key_read (struct file *file, char __user *buf, size_t len, loff_t *off) { unsigned int value = 0; value = copy_to_user(buf,&key_value,4);

}

static int key_open(struct inode *inode, struct file *filp) { int err = 0; int key_test_enabled = 0; int ret = 0;

}

static ssize_t key_write (struct file *filp, const char __user *buf, size_t len, loff_t *off) {

}

static int key_close(struct inode *inode, struct file *filp) { SUNXI_MASK_GPIO_IRQ(gpio_addr,IRQ_EINT22); SUNXI_MASK_GPIO_IRQ(gpio_addr,IRQ_EINT23);

}

static int __init key_init(void) { key_major = register_chrdev(0, "key_chrdev", &key_operations);

}

static void __exit key_exit(void) { if (gpio_addr) { iounmap(gpio_addr); }

}

module_init(key_init); module_exit(key_exit);

MODULE_DESCRIPTION("Driver for key"); MODULE_AUTHOR("wit_yuan"); MODULE_LICENSE("GPL");

ifeq ($(KERNELRELEASE),) KERNEL_DIR=/home/wityuan/Downloads/MarsBoard-A20-Linux-SDK-V1.2/linux-sunxi PWD=$(shell pwd)

modules: $(MAKE) -C $(KERNEL_DIR) M=$(PWD) modules arm-linux-gnueabihf-gcc -o key key.c

modules_install: $(MAKE) -C $(KERNEL_DIR) M=$(PWD) modules_install clean: rm -rf *.ko *.o .tmp_versions .mod.c modules.order Module.symvers . .cmd else obj-m:=key.o

endif

int main(int argc,char *argv[]) { int fd; int val; fd = open("/dev/key_device",O_RDWR); if(fd < 0){ printf("---open file error----\r\n"); return -1; }

}

/* EINT type PIO controller registers */

/* EINT type defines */

static wait_queue_head_t key_data_avail; static unsigned int key_done = 0;

static int int_cfg_addr[] = {PIO_INT_CFG0_OFFSET, PIO_INT_CFG1_OFFSET, PIO_INT_CFG2_OFFSET, PIO_INT_CFG3_OFFSET};

/* Setup GPIO irq mode (FALLING, RISING, BOTH, etc */

})

/* Enable GPIO interrupt for pin */

})

/* Disable GPIO interrupt for pin */

})

/* Set GPIO pin mode (input, output, etc) / / GPIO port has 4 cfg 32bit registers (8 pins each) / / First port cfg register addr = port_num * 0x24 */

})

static script_gpio_set_t info; static unsigned key_handler1; static unsigned key_handler2;

static struct class *key_class; static struct device *key_device; static unsigned int key_major;

static unsigned int key_value;

static void *__iomem gpio_addr = NULL;

static int key_open(struct inode *inode, struct file *filp); static ssize_t key_read (struct file *, char __user *, size_t, loff_t *); static ssize_t key_write (struct file *filp, const char __user *buf, size_t len, loff_t *off); static int key_close(struct inode *inode, struct file *filp);

struct file_operations key_operations = { .owner = THIS_MODULE, .open = key_open, .read = key_read, .write = key_write, .release = key_close, };

struct key_str{ char *name; int val; };

struct key_str g_key_str[2]={{"key1",0x1},{"key2",2}};

static irqreturn_t key_irq_handler1(int irq, void *dev_id) { int err; int reg_val = 0; int ret_val = 0;

}

static irqreturn_t key_irq_handler2(int irq, void *dev_id) {

}

static ssize_t key_read (struct file *file, char __user *buf, size_t len, loff_t *off) { unsigned int value = 0;

}

static int key_open(struct inode *inode, struct file *filp) { int err = 0; int key_test_enabled = 0; int ret = 0;

}

static ssize_t key_write (struct file *filp, const char __user *buf, size_t len, loff_t *off) {

}

static int key_close(struct inode *inode, struct file *filp) { SUNXI_MASK_GPIO_IRQ(gpio_addr,IRQ_EINT22); SUNXI_MASK_GPIO_IRQ(gpio_addr,IRQ_EINT23);

}

static int __init key_test_init(void) { key_major = register_chrdev(0, "key_chrdev", &key_operations);

}

static void __exit key_test_exit(void) { if (gpio_addr) { iounmap(gpio_addr); }

}

module_init(key_test_init); module_exit(key_test_exit);

MODULE_DESCRIPTION("Driver for key"); MODULE_AUTHOR("wit_yuan"); MODULE_LICENSE("GPL");

ifeq ($(KERNELRELEASE),) KERNEL_DIR=/home/wityuan/Downloads/MarsBoard-A20-Linux-SDK-V1.2/linux-sunxi PWD=$(shell pwd)

modules: $(MAKE) -C $(KERNEL_DIR) M=$(PWD) modules arm-linux-gnueabihf-gcc -o key key.c

modules_install: $(MAKE) -C $(KERNEL_DIR) M=$(PWD) modules_install clean: rm -rf *.ko *.o .tmp_versions .mod.c modules.order Module.symvers . .cmd else obj-m:=key.o

endif

int main(int argc,char *argv[]) { int fd; int val; fd = open("/dev/key_device",O_RDWR); if(fd < 0){ printf("---open file error----\r\n"); return -1; }

}

153 评论

相关问答

  • 派出所的毕业论文怎么写

    论文其实就是一种文章,就一种讨论某种问题或研究某种问题的文章。它有自己独有的论文格式。 下面就是标准的论文格式: 1、论文格式的论文题目:(下附署名)要求准确、

    酸奶娃儿 3人参与回答 2023-12-10
  • 毕业论文择要怎么写

    1、论文题目:要求准确、简练、醒目、新颖。2、目录:目录是论文中主要段落的简表。(短篇论文不必列目录)3、提要:是文章主要内容的摘录,要求短、精、完整。字数少可

    josephine383 4人参与回答 2023-12-11
  • 树莓派毕业论文

    许多同学需要的毕业设计与实现,其实网盘可以有了,只是你不知道,不需要到处找下载了相册管理系统JSP九宫格日记本鞋子商城销售网站图书商城项目管理系统JSP小说网美

    doubledennis 8人参与回答 2023-12-09
  • 毕业论文谢辞写词要怎么写

    大学毕业论文谢辞(精选7篇) 导语:大学毕业论文的谢辞包含哪些内容呢?大学毕业论文谢辞有着怎样感人肺腑的话语呢?下面是我分享的大学的毕业论文谢辞(精选7篇),欢

    苏州饭饭 2人参与回答 2023-12-09
  • 毕业论文摘要怎么写要不要写题目

    论文摘要怎么写 一、论文摘要的定义 摘要一般应说明研究工作目的、实验方法、结果和最终结论等.而重点是结果和结论。中文摘要一般不宜超过300字,外文摘要不宜

    shop移民Shero 2人参与回答 2023-12-10