极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 49167|回复: 10

Arduino实验:JAVA控制LED,PWM调节亮度

[复制链接]
发表于 2013-9-21 12:50:11 | 显示全部楼层 |阅读模式
做这个小实验的灵感来自网友xavierchen,他用ENC28J60做了一个网络控制LED的东西,上位机用WEB方式来控制。
自已手头上正好有个W5100,本人对WEB编程不熟,所以就用了自己比较熟悉的JAVA写了一个上位机控制端。东西很简单,发出来给我像一样的初学者参考,共同学习

一、硬件准备:
1、Arduino uno r3
2、EthernetShiled W5100
3、面包板 1个
4、发光二极管 1个
5、杜邦线 两根
6、网线 1根
7、1K电阻一个
二、开发环境:
1、Arduino IDE --开发下位机程序
2、Eclipse for JAVA--开发上位机程序
3、sscom32 串口信息查看软件--查看arduino接收数据、调试
三、LED灯连线图(PS,这个面包板结构让我费解了很久,好吧,我承认现在依然费解……)


四、原理
JAVA(上位机Client)——>EthernetShiled(以太网模块)——>Arduino(下位机Server,PWM)——>LED
上位机与以太网模块采用socket TCP连接通信

五、下位机--arduino程序
  1. #include <SPI.h>
  2. #include <Ethernet.h>
  3. byte mac[]={0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
  4. IPAddress serverIP(192,168,2,1);
  5. int serverPort=1981;
  6. EthernetServer server(serverPort);
  7. int whitePin=9;
  8. void setup(){
  9.   Serial.begin(9600);
  10.   pinMode(whitePin,OUTPUT);
  11.   Ethernet.begin(mac,serverIP);
  12.   server.begin();
  13.   Serial.println("Server started");
  14. }

  15. void loop(){
  16.   EthernetClient client=server.available();
  17.   if(client){
  18.     String clientMsg="";
  19.     while(client.connected()){
  20.       if(client.available()){  
  21.       int c=client.read();
  22.       analogWrite(whitePin,c);
  23.       Serial.println(c);
  24.         }
  25.     }
  26.   }
  27.   delay(1);
  28.   client.stop();
  29. }
复制代码

六、上位机程序
[pre lang="java" line="1"]import java.beans.ExceptionListener;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JSlider;
import javax.swing.JTextField;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

public class ledManager extends JFrame implements ChangeListener{

JTextField textField1;
JLabel label1;
JSlider slider1;
JPanel panel;
private static final String ServerIP="192.168.2.1";
private static final int ServerPort=1981;
private Socket client;
public int str;

public void init(){
setTitle("LED灯网络控制端");
setSize(500,80);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//setLocationRelativeTo(JFrame.CENTER_ALIGNMENT)
label1=new JLabel("LED1");
textField1=new JTextField(5);
slider1=new JSlider(JSlider.HORIZONTAL,0,255,10);
panel=new JPanel();
panel.add(label1);
panel.add(slider1);
panel.add(textField1);
add(panel);
slider1.addChangeListener(this);
}
public void stateChanged(ChangeEvent event) {
// TODO Auto-generated method stub
str=slider1.getValue();
textField1.setText(""+str);
try {
sendSingle(str);
System.out.println(str);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void connServer() throws IOException{
System.out.println("try to connecting Server!");
client=new Socket(ServerIP,ServerPort);
System.out.println("Successful to connected Arduino");
}
public void discConnServer() throws IOException{
client.close();
}
public void sendSingle(int s) throws IOException{
DataOutputStream send=new DataOutputStream(client.getOutputStream());
send.write(s);
}
//public void senSingle(String s) throws Exception, IOException{
//final String ServerIP="192.168.2.1";
//final int ServerPort=8888;
//Socket cs=new Socket(ServerIP,ServerPort);
//System.out.println("connect to Server:"+ServerIP+"at port:"+ServerPort);
//DataOutputStream singleToArduino=new DataOutputStream(cs.getOutputStream());
//singleToArduino.writeBytes(s);
//cs.close();
//}
public static void main(String[] args) throws IOException{
ledManager ldm=new ledManager();
ldm.connServer();
ldm.init();
}
}[/code]

存在问题:
1、通过观察,上位机数据发送到下位机的时候,明显发现串口显示的数据有延迟,下位机是只有32K的单片机,这很正常,这个问题如何解决呢?
2、如果使用UDP的通信方式又该怎么做?
3、中午的锅碗瓢盆都没洗,一大堆衣服没洗,这才是最大的问题,肿么办啊
思考:话说这个东西没有多大实际应用价值,但对于我来说意义是重大的,基本上搞清楚了上位机通过以太网与下位机之间的通信问题,接下来可以连接更多的传感器到Arduino上,做些更好玩的东西了。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

发表于 2013-9-21 17:05:07 | 显示全部楼层
用的什么画图的啊~~~
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-9-21 22:49:00 | 显示全部楼层
龙翔竞天 发表于 2013-9-21 17:05
用的什么画图的啊~~~

fritzing 画图
http://fritzing.org/download/
回复 支持 反对

使用道具 举报

发表于 2013-9-21 22:55:41 | 显示全部楼层
把碗丢了就是了,衣服丢洗衣机,或者找个女朋友。。。。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-9-21 23:02:17 | 显示全部楼层
龙翔竞天 发表于 2013-9-21 17:05
用的什么画图的啊~~~

Virtual Breadboad也可以,不过这个是收费的
回复 支持 反对

使用道具 举报

发表于 2013-9-30 10:09:36 | 显示全部楼层
原来是你!{:soso_e179:}
回复 支持 反对

使用道具 举报

发表于 2013-10-1 06:12:10 | 显示全部楼层
agaonet 发表于 2013-9-21 22:55
把碗丢了就是了,衣服丢洗衣机,或者找个女朋友。。。。

找了女朋友,还要帮女朋友洗衣服,洗碗,就更没时间了。
回复 支持 反对

使用道具 举报

发表于 2014-2-19 23:05:28 | 显示全部楼层
换成YUN的话,#include <Ethernet.h> 要更改吗?我用YUN然后用LZ的code,没有反应哦。
回复 支持 反对

使用道具 举报

发表于 2014-3-2 15:36:08 | 显示全部楼层
新手 适合入手
回复 支持 反对

使用道具 举报

发表于 2015-3-4 16:18:50 | 显示全部楼层
您好 我就单纯的想连接Java 和 Arduino 用这个方便还是用蓝牙模块方便啊
回复 支持 反对

使用道具 举报

发表于 2018-3-9 21:55:37 | 显示全部楼层
学习了,有部分程序看不明白,我将继续学习
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-3-29 16:03 , Processed in 0.044359 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表