freepig 发表于 2013-9-21 12:50:11

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

做这个小实验的灵感来自网友xavierchen,他用ENC28J60做了一个网络控制LED的东西,上位机用WEB方式来控制。
自已手头上正好有个W5100,本人对WEB编程不熟,所以就用了自己比较熟悉的JAVA写了一个上位机控制端。东西很简单,发出来给我像一样的初学者参考,共同学习
http://player.youku.com/player.php/sid/XNjExNDM0MjQ0/v.swf
一、硬件准备:
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程序
#include <SPI.h>
#include <Ethernet.h>
byte mac[]={0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
IPAddress serverIP(192,168,2,1);
int serverPort=1981;
EthernetServer server(serverPort);
int whitePin=9;
void setup(){
Serial.begin(9600);
pinMode(whitePin,OUTPUT);
Ethernet.begin(mac,serverIP);
server.begin();
Serial.println("Server started");
}

void loop(){
EthernetClient client=server.available();
if(client){
    String clientMsg="";
    while(client.connected()){
      if(client.available()){
      int c=client.read();
      analogWrite(whitePin,c);
      Serial.println(c);
      }
    }
}
delay(1);
client.stop();
}
六、上位机程序
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();
}
}

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

龙翔竞天 发表于 2013-9-21 17:05:07

用的什么画图的啊~~~

freepig 发表于 2013-9-21 22:49:00

龙翔竞天 发表于 2013-9-21 17:05 static/image/common/back.gif
用的什么画图的啊~~~

fritzing 画图
http://fritzing.org/download/

agaonet 发表于 2013-9-21 22:55:41

把碗丢了就是了,衣服丢洗衣机,或者找个女朋友。。。。

freepig 发表于 2013-9-21 23:02:17

龙翔竞天 发表于 2013-9-21 17:05 static/image/common/back.gif
用的什么画图的啊~~~

Virtual Breadboad也可以,不过这个是收费的

kaig2008 发表于 2013-9-30 10:09:36

原来是你!{:soso_e179:}

szpapas 发表于 2013-10-1 06:12:10

agaonet 发表于 2013-9-21 22:55 static/image/common/back.gif
把碗丢了就是了,衣服丢洗衣机,或者找个女朋友。。。。

找了女朋友,还要帮女朋友洗衣服,洗碗,就更没时间了。

hikarumk2 发表于 2014-2-19 23:05:28

换成YUN的话,#include <Ethernet.h> 要更改吗?我用YUN然后用LZ的code,没有反应哦。

RubinYim 发表于 2014-3-2 15:36:08

新手 适合入手

求学Arduino 发表于 2015-3-4 16:18:50

您好 我就单纯的想连接Java 和 Arduino 用这个方便还是用蓝牙模块方便啊

MWD--文化易人 发表于 2018-3-9 21:55:37

学习了,有部分程序看不明白,我将继续学习
页: [1]
查看完整版本: Arduino实验:JAVA控制LED,PWM调节亮度