脑系统

最近,各种类型的智力游戏越来越流行:“什么?在哪 什么时候?”,“ Melotrek”,“脑环”。但是对于某些类型的游戏,您将离不开可以控制游戏进程的特殊系统。在这里,作为课程项目的一部分,他们决定尝试建立自己的大脑系统。

在此之前,我们从未遇到过Arduino或某种硬件,但在研究大学中的朋友和熟人如何轻松组装设备后,我们想尝试做自己的事情。由于我们离这个话题还很远,因此领导者提出了组装大脑系统的建议,称这对我们来说是一个好的开始。令人惊讶的是,这发生了。

首先,我们确定了目标:大脑系统应发出音频信号,指示问题回合时间的开始,并发出信号指示问题回合时间的结束,并且还应向主机发出信号,告知玩家玩家准备好给出答案了。如果一个玩家按下一个按钮,则其余按钮将被阻止。还应该有选择游戏模式的能力。



所需组件


  • Arduino纳米
  • 讲者
  • LED 8个
  • 4 . 2
  • DIP-
  • :
  • 8 . – 100 ( )
  • 6 . – 10 ( )
  • 6 . – 1
  • 4 . – 470 DIP ( )
  • 5 . – ( )
  • – 6 . 1
  • Ethernet- 4 .
  • RJ-45 — 4.


值得一提的是,系统可以分为3个模块:主模块,播放器按钮(4个)和连接电缆。系统包含4个播放器按钮。如果播放器设法比其他播放器更早按下,则其按​​钮上的LED会亮起。

远程主机。如果玩家按下遥控器上的按钮,则与玩家按钮对应的二极管将在主机上点亮。该模块选择游戏模式。演示者有两个“开始”和“重置”按钮。根据游戏的不同,这些按钮会打开并重置计时器。

Arduino信号来自按钮。如果按下该按钮,则该按钮和主机遥控器上的二极管将点亮,并且声音信号将打开。这是主要概念。

按钮和主控台通过以太网电缆连接。一个按钮接地,一个逻辑单元和一个用于打开和关闭LED的信号,一个按钮从该按钮到达主模块,按下该按钮。

开发开始


我们从最简单的开始。包含二极管的电路组装在试验板上。一切正常!我们继续前进。我们连接了Arduino和按钮,当按下按钮时,二极管点亮。在这里,我们面临着按钮不停摇动的问题。



在按钮中,您需要消除信号的颤动,否则系统会认为该按钮已被按下多次。对于玩家的按钮来说,这并不是很吓人,我们仍然会抓住第一按,但是在领先的开始按钮上,您必须摆脱反弹,因为在脑环中,您需要知道按下开始的次数。为此,按钮电路中包括施密特触发器,电容器和电阻器。您可以在此处阅读有关弹跳的信息



按钮和主模块均使用LED。但是5V对他们来说太高了。因此,为了防止二极管燃烧,将电阻器串联连接。您可以在此处计算电阻器的电阻由于所有LED都相同,因此我们需要8个100欧姆的电阻。



使用DIP-SWITCH选择游戏模式:

  1. 脑环
  2. 什么啊 在哪 什么时候
  3. 拼字游戏四重奏,三驾马车,自己开发的游戏(这些游戏的系统相同)

软件部分


懒惰是成功的关键。

在电路开发的同时,编写了代码。很明显,应该通过中断来处理按钮的按下。减去大约2个外部中断INT0和INT1,我们很沮丧,因为对于多达6个按钮,两个中断是不够的,您将不得不增加通过寄存器的位深度。自从我们第一次接触到硬件以来,一切就已经存在了,对我们而言,一切都是复杂而难以理解的。总的来说,我们对这一事实并不满意。不相信我们的问题无法以其他任何方式解决,我们遇到了Pin Change Interrupt Requests,这对我们的项目是完美的。没有寄存器!

您可以在这里熟悉打扰

在我们的大脑系统中,“设置”和“重置”按钮对应于引脚D8和D9,而用户按钮对应于A0-A3。因此,对于每个使用的中断组,我们仅定义了两个中断处理程序。

  • ISR(PCINT0_vect)-主按钮。
  • ISR(PCINT1_vect)-用于自定义按钮。

可以为每个组和每个引脚分别定义中断。这是通过控制寄存器和掩码来完成的,其中必须设置相应的值。有关设置和解决中断的更多信息,请参见此处

中断处理程序逐个查询销,以确定按下了哪个按钮。这种情况是这些中断的局限之一。大脑系统必须响应按钮的按下,因此将引脚值与中断处理程序中的HIGH电平(即按钮已被按下)进行比较。

配置中断
ISR(PCINT0_vect) {
	noInterrupts();
	isPushed = false;
	if (digitalRead(ADMIN_BUTTON_SET) == HIGH ) {	
		gameMode->Set();
		Timer1.attachInterrupt(TimerInterrupt);
		gameMode->SetFalseStart(false);
	}
	if (digitalRead(ADMIN_BUTTON_RESET) == HIGH) {
		Timer1.stop();
		gameMode->Reset();
		gameMode->SetFalseStart(true);
	}
	interrupts();
}

ISR(PCINT1_vect){
	noInterrupts();	
	if (isPushed == false){
		for (int i = 0; i < ARRAY_SIZE(ARRAY_USER_BUTTON); i++){
			if (digitalRead(ARRAY_USER_BUTTON[i]) == HIGH){
				isPushed = gameMode->UserButtonPushed(ARRAY_LED[i]);
			}
		}		
	}	
	interrupts();
}


所有代码都在这里

安装方式


我们是第一次看到烙铁,所以我们从传统二极管开始。我们焊接了-二极管着火了!然后将按钮焊接起来。由于主模块仍位于试验板上,因此很难检查所有操作是否正确完成。



主按钮,二极管,游戏模式开关已焊接。在此过程中,我们意识到可以通过一个施密特触发器来实现。然后应将其传输到主模块,通过网络电缆将按钮的输出连接至主模块,并将其输出的信号馈入Arduino。





总的来说,主机已经准备就绪。但是他仍然没有与球员的按钮联系在一起。我们将路由器的本机板作为主机的基础,其中使用RJ-45连接器是有利的。尽管我们对此感到有些遗憾,但因为在第二轮切割电路板和焊接触点并不是一种愉快的体验。但是一切顺利。

我们将白色橙色导体用于逻辑1传输,将橙色用于逻辑0传输,将白绿色信号传输至二极管,将绿色按钮信号传输。尽管您可以使用任何电缆,但主要是检查使用的电缆,因为有多种压接选项。

现在,主模块和按钮已连接,系统几乎已准备就绪,但是面包板上没有一个错误。如果该按钮未连接到主模块,则系统认为该按钮已被按下。在互联网上,我们找到了一个解决方案-上拉电阻。

为了使主模块中的“ no”信号到达Arduino(根本没有连接按钮),您需要在每个按钮输出上放置一个下拉电阻(从10 kOhm起)。开路时,不希望有的电流将流经电阻器到达地面,当由于电阻器的高电阻而闭合时,信号将进入输入触点。

解决此问题后,它起作用了。



游戏模式功能


脑环的特征。如果尚未按下开始,则系统将按钮按下定义为错误的开始。如果是第一次按下启动按钮,则系统将等待20秒以使按钮被按下,一段时间后,系统将发出警报。如果在此期间,团队仍然知道正确的答案并按下按钮,则相应的信号将响起,然后计时器停止计时。按照规则,如果答案不正确,其他团队也应该能够回答。为此,在第二次按下启动按钮后,计时器将启动10秒钟。重置按钮可重置系统,在阅读下一个问题之前,请按下该按钮。

特点是什么?在哪 什么时候


按开始后,会发出声音信号。50秒和60秒后会发出声音信号。在其他游戏中,仅捕获玩家的按钮。得益于使用Arduino的便利,您可以实现其他游戏:更改计时器,启用错误启动等。这可以通过添加适当的代码来实现。




结论


它行得通,感谢上帝。由于这是我们的第一次硬件体验,因此我们对结果感到满意。不仅因为所有工作都在面包板上连接,而且还因为它是完全组装的设备。具有功能,播放器和演示者的成熟的大脑系统已经发布。作为系统的改进,您可以为扬声器添加输出,以便您可以参加大型锦标赛。
至于Arduino开发板,工作起来既轻松又愉快。在Internet上,有足够的信息和简单的教程来讲述有用且有趣的部分的组装,这对于一个不知情的人来说并非最简单。这很可能会变成一种爱好。

Oksana Kozlova和Marina Bardiyan参与了该项目。

Source: https://habr.com/ru/post/zh-CN394359/


All Articles