基于android和arduino 的小车控制,小车部分采用的是 arduino 开源硬件实现,arduino 学起来比较简单,看看文档在看几个例子基本就会了。官网是http://arduino.cc/
我是在某宝上购买的一组套件,最终发现很多都没有用上,有点眼高手低。android 和 arduino 通信 是通过蓝牙。小车控制比较简单,前、后、左、右、向左转圈、向右转圈。
以下是源码;
1:arduino 源码:
#include <BaseCar.h> // log const boolean VERBOSE = true; const int SERIAL_SPEED = 9600; // for Car //1-ok const int MOTO1_PIN = 2; const int I11_PIN = 3; const int I12_PIN = 4; //2 const int MOTO2_PIN = 5; const int I21_PIN = 6; const int I22_PIN = 7; //3-ok const int MOTO3_PIN = 8; const int I31_PIN = 9; const int I32_PIN =10; //4 const int MOTO4_PIN = 11; const int I41_PIN = 12; const int I42_PIN = 13; // speed const int SPEED_VAL =500; // delay const int DELAY_TIME = 300; //bouttooth char RECEIVE_VALUE='q_z_1'; // car control BaseCar car(MOTO1_PIN, MOTO2_PIN, MOTO3_PIN, MOTO4_PIN,I11_PIN, I12_PIN, I21_PIN, I22_PIN,I31_PIN, I32_PIN, I41_PIN, I42_PIN); const int adj = 19; void setup() { if (VERBOSE) { Serial.begin(SERIAL_SPEED); } } void loop() { // RECEIVE_VALUE=Serial.read(); //Serial.println(RECEIVE_VALUE); if(RECEIVE_VALUE=='q_z_1'){ // 左前一度 car.forward(SPEED_VAL, adj); }else if(RECEIVE_VALUE=='q_z_2'){ // 左前二度 car.turnLeft(SPEED_VAL, adj); }else if(RECEIVE_VALUE=='q_z_3'){ // 左前三度-向左旋转 car.rotateLeft(SPEED_VAL, adj); }else if(RECEIVE_VALUE=='q_y_1'){ // 右前一度 car.forward(SPEED_VAL, adj); }else if(RECEIVE_VALUE=='q_y_2'){ // 右前二度 car.turnRight(SPEED_VAL, adj); }else if(RECEIVE_VALUE=='q_y_3'){ // 右前三度-向右旋转 car.rotateRight(SPEED_VAL, adj); }else{ // 刹车 car.standBy(); } }
1.1 将 以下两个类放在libiriary 下 文件夹名命名为 car
#include "Arduino.h" #include "BaseCar.h" BaseCar::BaseCar(int left_back_speed, int left_forward_speed,int right_forward_speed, int right_back_speed, int left_back_1, int left_back_2, int left_forward_1, int left_forward_2,int right_forward_1, int right_forward_2,int right_back_1, int right_back_2){ _left_back_speed = left_back_speed; _left_forward_speed = left_forward_speed; _right_forward_speed = right_forward_speed; _right_back_speed = right_back_speed; pinMode(left_back_speed, OUTPUT); pinMode(left_forward_speed, OUTPUT); pinMode(right_forward_speed, OUTPUT); pinMode(right_back_speed, OUTPUT); _left_back_1 = left_back_1; _left_back_2 = left_back_2; _left_forward_1 = left_forward_1; _left_forward_2 = left_forward_2; _right_forward_1 = right_forward_1; _right_forward_2 = right_forward_2; _right_back_1 = right_back_1; _right_back_2 = right_back_2; pinMode(left_back_1, OUTPUT); pinMode(left_back_2, OUTPUT); pinMode(left_forward_1, OUTPUT); pinMode(left_forward_2, OUTPUT); pinMode(right_forward_1, OUTPUT); pinMode(right_forward_2, OUTPUT); pinMode(right_back_1, OUTPUT); pinMode(right_back_2, OUTPUT); } //停止 void BaseCar::standBy() { _status.left_back_speed_h = 0; _status.left_forward_speed_h = 0; _status.right_forward_speed_h = 0; _status.right_back_speed_h = 0; _status.left_back_1_h = HIGH; _status.left_back_2_h = HIGH; _status.left_forward_1_h = HIGH; _status.left_forward_2_h = HIGH; // _status.right_forward_1_h = HIGH; _status.right_forward_2_h = HIGH; _status.right_back_1_h = HIGH; _status.right_back_2_h = HIGH; _go(); } //向前 void BaseCar::forward(int moto_speed, int adj) { _status.left_back_speed_h = moto_speed + adj; _status.left_forward_speed_h = moto_speed + adj; _status.right_forward_speed_h = moto_speed + adj; _status.right_back_speed_h = moto_speed + adj; _status.left_back_1_h = LOW; _status.left_back_2_h = HIGH; _status.left_forward_1_h = LOW; _status.left_forward_2_h = HIGH; _status.right_forward_1_h = LOW; _status.right_forward_2_h = HIGH; _status.right_back_1_h = LOW; _status.right_back_2_h = HIGH; _status.adj = adj; _go(); } //向后 void BaseCar::backward(int moto_speed, int adj) { _status.left_back_speed_h = moto_speed + adj; _status.left_forward_speed_h = moto_speed + adj; _status.right_forward_speed_h = moto_speed + adj; _status.right_back_speed_h = moto_speed + adj; _status.left_back_1_h = HIGH; _status.left_back_2_h = LOW; _status.left_forward_1_h = HIGH; _status.left_forward_2_h = LOW; _status.right_forward_1_h = HIGH; _status.right_forward_2_h = LOW; _status.right_back_1_h = HIGH; _status.right_back_2_h = LOW; _status.adj = adj; _go(); } //左转 void BaseCar::turnLeft(int moto_speed, int adj) { _status.left_back_speed_h = moto_speed - adj; _status.left_forward_speed_h = moto_speed - adj; _status.right_forward_speed_h = moto_speed + adj; _status.right_back_speed_h = moto_speed + adj; _status.left_back_1_h = LOW; _status.left_back_2_h = HIGH; _status.left_forward_1_h = LOW; _status.left_forward_2_h = HIGH; _status.right_forward_1_h = LOW; _status.right_forward_2_h = HIGH; _status.right_back_1_h = LOW; _status.right_back_2_h = HIGH; _status.adj = adj; _go(); } //右转 void BaseCar::turnRight(int moto_speed, int adj) { _status.left_back_speed_h = moto_speed + adj; _status.left_forward_speed_h = moto_speed + adj; _status.right_forward_speed_h = moto_speed - adj; _status.right_back_speed_h = moto_speed - adj; _status.left_back_1_h = LOW; _status.left_back_2_h = HIGH; _status.left_forward_1_h = LOW; _status.left_forward_2_h = HIGH; _status.right_forward_1_h = LOW; _status.right_forward_2_h = HIGH; _status.right_back_1_h = LOW; _status.right_back_2_h = HIGH; _status.adj = adj; _go(); } //向左旋转(右边向前转,左边向后转) void BaseCar::rotateLeft(int moto_speed, int adj) { _status.left_back_speed_h = moto_speed + adj; _status.left_forward_speed_h = moto_speed + adj; _status.right_forward_speed_h = moto_speed + adj; _status.right_back_speed_h = moto_speed + adj; _status.left_back_1_h = HIGH; _status.left_back_2_h = LOW; _status.left_forward_1_h = HIGH; _status.left_forward_2_h = LOW; _status.right_forward_1_h = LOW; _status.right_forward_2_h = HIGH; _status.right_back_1_h = LOW; _status.right_back_2_h = HIGH; _status.adj = adj; _go(); } //向右旋转 void BaseCar::rotateRight(int moto_speed, int adj) { _status.left_back_speed_h = moto_speed + adj; _status.left_forward_speed_h = moto_speed + adj; _status.right_forward_speed_h = moto_speed + adj; _status.right_back_speed_h = moto_speed + adj; _status.left_back_1_h = LOW; _status.left_back_2_h = HIGH; _status.left_forward_1_h = LOW; _status.left_forward_2_h = HIGH; _status.right_forward_1_h = HIGH; _status.right_forward_2_h = LOW; _status.right_back_1_h = HIGH; _status.right_back_2_h = LOW; _status.adj = adj; _go(); } void BaseCar::_go() { digitalWrite(_left_back_1, _status.left_back_1_h); digitalWrite(_left_back_2, _status.left_back_2_h); digitalWrite(_left_forward_1, _status.left_forward_1_h); digitalWrite(_left_forward_2, _status.left_forward_2_h); digitalWrite(_right_forward_1, _status.right_forward_1_h); digitalWrite(_right_forward_2, _status.right_forward_2_h); digitalWrite(_right_back_1, _status.right_back_1_h); digitalWrite(_right_back_2, _status.right_back_2_h); analogWrite(_left_back_speed, _status.left_back_speed_h); analogWrite(_left_forward_speed, _status.left_forward_speed_h); analogWrite(_right_forward_speed, _status.right_forward_speed_h); analogWrite(_right_back_speed, _status.right_back_speed_h); } CarStatus BaseCar::getStatus() { return _status; }
#ifndef BaseCar_h #define BaseCar_h #include "Arduino.h" struct CarStatus { int left_back_1_h; int left_back_2_h; int left_forward_1_h; int left_forward_2_h; int right_forward_1_h; int right_forward_2_h; int right_back_1_h; int right_back_2_h; int left_back_speed_h; int left_forward_speed_h; int right_forward_speed_h; int right_back_speed_h; int adj; }; class BaseCar { public: BaseCar(int left_back_speed, int left_forward_speed,int right_forward_speed, int right_back_speed, int left_back_1, int left_back_2, int left_forward_1, int left_forward_2,int right_forward_1, int right_forward_2,int right_back_1, int right_back_2); void standBy(); void forward(int moto_speed, int adj); void backward(int moto_speed, int adj); void turnLeft(int moto_speed, int adj); void turnRight(int moto_speed, int adj); void rotateLeft(int moto_speed, int adj); void rotateRight(int moto_speed, int adj); CarStatus getStatus(); private: int _left_back_speed; int _left_forward_speed; int _right_forward_speed; int _right_back_speed; int _left_back_1; int _left_back_2; int _left_forward_1; int _left_forward_2; int _right_forward_1; int _right_forward_2; int _right_back_1; int _right_back_2; CarStatus _status; void _go(); }; #endif
2:android 源码如下:
package com.robot; import java.io.IOException; import java.io.OutputStream; import java.util.UUID; import android.app.Activity; import android.bluetooth.BluetoothAdapter; import android.bluetooth.BluetoothDevice; import android.bluetooth.BluetoothSocket; import android.content.pm.ActivityInfo; import android.os.Bundle; import android.util.Log; import android.view.Gravity; import android.view.MotionEvent; import android.view.View; import android.view.View.OnTouchListener; import android.widget.CheckBox; import android.widget.CompoundButton; import android.widget.CompoundButton.OnCheckedChangeListener; import android.widget.ImageView; import android.widget.TextView; import android.widget.Toast; public class AAActivity extends Activity { private TextView state; private ImageView forward; private ImageView back; private ImageView left_2; private ImageView right_2; boolean isStart = false; private static final UUID MY_UUID = UUID .fromString("00001101-0000-1000-8000-00805F9B34FB"); private static String address = "00:12:02:06:01:32"; private static final String TAG = "THINBTCLIENT"; private static final boolean D = true; private BluetoothAdapter mBluetoothAdapter = null; private BluetoothSocket btSocket = null; private OutputStream outStream = null; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.index); initUI(); } @Override protected void onStart() { super.onStart(); } public void setValue(String message, final String text) { if (isStart) { state.setText(text); byte[] msgBuffer; try { outStream = btSocket.getOutputStream(); } catch (IOException e) { Log.e(TAG, "ON RESUME: Output stream creation failed.", e); } msgBuffer = message.getBytes(); try { outStream.write(msgBuffer); } catch (IOException e) { Log.e(TAG, "ON RESUME: Exception during write.", e); } } else { Toast.makeText(this, "请先选择开启!", Toast.LENGTH_SHORT).show(); } } private void initUI() { state = (TextView) findViewById(R.id.state); CheckBox blueT = (CheckBox) findViewById(R.id.blueT); blueT.setOnCheckedChangeListener(new OnCheckedChangeListener() { public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { isStart = isChecked; } }); forward = (ImageView) findViewById(R.id.forward); forward.setImageResource(R.drawable.forward); forward.setOnTouchListener(new OnTouchListener() { public boolean onTouch(View v, MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_DOWN) { forward.setImageResource(R.drawable.forward_r); setValue("1", "直走"); } if (event.getAction() == MotionEvent.ACTION_UP) { forward.setImageResource(R.drawable.forward); setValue("7", "刹车"); } return true; } }); back = (ImageView) findViewById(R.id.back); back.setImageResource(R.drawable.back); back.setOnTouchListener(new OnTouchListener() { public boolean onTouch(View v, MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_DOWN) { back.setImageResource(R.drawable.back_r); setValue("6", "后退"); } if (event.getAction() == MotionEvent.ACTION_UP) { back.setImageResource(R.drawable.back); setValue("7", "刹车"); } return true; } }); left_2 = (ImageView) findViewById(R.id.left_2); left_2.setImageResource(R.drawable.left_2); left_2.setOnTouchListener(new OnTouchListener() { public boolean onTouch(View v, MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_DOWN) { left_2.setImageResource(R.drawable.left_2_r); setValue("3", "左前二度"); } if (event.getAction() == MotionEvent.ACTION_UP) { left_2.setImageResource(R.drawable.left_2); setValue("7", "刹车"); } return true; } }); right_2 = (ImageView) findViewById(R.id.right_2); right_2.setImageResource(R.drawable.right_2); right_2.setOnTouchListener(new OnTouchListener() { public boolean onTouch(View v, MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_DOWN) { right_2.setImageResource(R.drawable.right_2_r); setValue("5", "右前二度"); } if (event.getAction() == MotionEvent.ACTION_UP) { right_2.setImageResource(R.drawable.right_2); setValue("7", "刹车"); } return true; } }); if (D) Log.e(TAG, "+++ ON CREATE +++"); mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); if (mBluetoothAdapter == null) { Toast.makeText(this, "蓝牙设备不可用,请打开蓝牙!", Toast.LENGTH_LONG).show(); finish(); return; } if (!mBluetoothAdapter.isEnabled()) { Toast.makeText(this, "请打开蓝牙并重新运行程序!", Toast.LENGTH_LONG).show(); finish(); return; } if (D) Log.e(TAG, "+++ DONE IN ON CREATE, GOT LOCAL BT ADAPTER +++"); } public void onPause() { if (getRequestedOrientation() != ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE) { setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); } super.onPause(); if (D) Log.e(TAG, "- ON PAUSE -"); if (outStream != null) { try { outStream.flush(); } catch (IOException e) { Log.e(TAG, "ON PAUSE: Couldn't flush output stream.", e); } } try { btSocket.close(); } catch (IOException e2) { DisplayToast("套接字关闭失败!"); } } public void onStop() { super.onStop(); if (D) Log.e(TAG, "-- ON STOP --"); } public void onDestroy() { super.onDestroy(); if (D) Log.e(TAG, "--- ON DESTROY ---"); } public void DisplayToast(String str) { Toast toast = Toast.makeText(this, str, Toast.LENGTH_LONG); toast.setGravity(Gravity.TOP, 0, 220); toast.show(); } public void onResume() { super.onResume(); if (D) { Log.e(TAG, "+ ON RESUME +"); Log.e(TAG, "+ ABOUT TO ATTEMPT CLIENT CONNECT +"); } DisplayToast("正在尝试连接智能小车,请稍后····"); BluetoothDevice device = mBluetoothAdapter.getRemoteDevice(address); try { btSocket = device.createRfcommSocketToServiceRecord(MY_UUID); } catch (IOException e) { e.printStackTrace(); DisplayToast("套接字创建失败!"); } DisplayToast("成功连接智能小车!可以开始操控了~~~"); mBluetoothAdapter.cancelDiscovery(); try { btSocket.connect(); DisplayToast("连接成功建立,数据连接打开!"); } catch (IOException e) { try { btSocket.close(); } catch (IOException e2) { DisplayToast("连接没有建立,无法关闭套接字!"); } } if (D) Log.e(TAG, "+ ABOUT TO SAY SOMETHING TO SERVER +"); } }
相关推荐
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。
MMC整流器技术解析:基于Matlab的双闭环控制策略与环流抑制性能研究,Matlab下的MMC整流器技术文档:18个子模块,双闭环控制稳定直流电压,环流抑制与最近电平逼近调制,优化桥臂电流波形,高效并网运行。,MMC整流器(Matlab),技术文档 1.MMC工作在整流侧,子模块个数N=18,直流侧电压Udc=25.2kV,交流侧电压6.6kV 2.控制器采用双闭环控制,外环控制直流电压,采用PI调节器,电流内环采用PI+前馈解耦; 3.环流抑制采用PI控制,能够抑制环流二倍频分量; 4.采用最近电平逼近调制(NLM), 5.均压排序:电容电压排序采用冒泡排序,判断桥臂电流方向确定投入切除; 结果: 1.输出的直流电压能够稳定在25.2kV; 2.有功功率,无功功率稳态时波形稳定,有功功率为3.2MW,无功稳定在0Var; 3.网侧电压电流波形均为对称的三相电压和三相电流波形,网侧电流THD=1.47%<2%,符合并网要求; 4.环流抑制后桥臂电流的波形得到改善,桥臂电流THD由9.57%降至1.93%,环流波形也可以看到得到抑制; 5.电容电压能够稳定变化 ,工作点关键词:MMC
Boost二级升压光伏并网结构的Simulink建模与MPPT最大功率点追踪:基于功率反馈的扰动观察法调整电压方向研究,Boost二级升压光伏并网结构的Simulink建模与MPPT最大功率点追踪:基于功率反馈的扰动观察法调整电压方向研究,Boost二级升压光伏并网结构,Simulink建模,MPPT最大功率点追踪,扰动观察法采用功率反馈方式,若ΔP>0,说明电压调整的方向正确,可以继续按原方向进行“干扰”;若ΔP<0,说明电压调整的方向错误,需要对“干扰”的方向进行改变。 ,Boost升压;光伏并网结构;Simulink建模;MPPT最大功率点追踪;扰动观察法;功率反馈;电压调整方向。,光伏并网结构中Boost升压MPPT控制策略的Simulink建模与功率反馈扰动观察法
STM32F103C8T6 USB寄存器开发详解(12)-键盘设备
科技活动人员数专指直接从事科技活动以及专门从事科技活动管理和为科技活动提供直接服务的人员数量
Matlab Simulink仿真探究Flyback反激式开关电源性能表现与优化策略,Matlab Simulink仿真探究Flyback反激式开关电源的工作机制,Matlab Simulimk仿真,Flyback反激式开关电源仿真 ,Matlab; Simulink仿真; Flyback反激式; 开关电源仿真,Matlab Simulink在Flyback反激式开关电源仿真中的应用
基于Comsol的埋地电缆电磁加热计算模型:深度解析温度场与电磁场分布学习资料与服务,COMSOL埋地电缆电磁加热计算模型:温度场与电磁场分布的解析与学习资源,comsol 埋地电缆电磁加热计算模型,可以得到埋地电缆温度场及电磁场分布,提供学习资料和服务, ,comsol;埋地电缆电磁加热计算模型;温度场分布;电磁场分布;学习资料;服务,Comsol埋地电缆电磁加热模型:温度场与电磁场分布学习资料及服务
1、文件内容:ibus-table-chinese-yong-1.4.6-3.el7.rpm以及相关依赖 2、文件形式:tar.gz压缩包 3、安装指令: #Step1、解压 tar -zxvf /mnt/data/output/ibus-table-chinese-yong-1.4.6-3.el7.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm 4、更多资源/技术支持:公众号禅静编程坊
基于51单片机protues仿真的汽车智能灯光控制系统设计(仿真图、源代码) 一、设计项目 根据本次设计的要求,设计出一款基于51单片机的自动切换远近光灯的设计。 技术条件与说明: 1. 设计硬件部分,中央处理器采用了STC89C51RC单片机; 2. 使用两个灯珠代表远近光灯,感光部分采用了光敏电阻,因为光敏电阻输出的是电压模拟信号,单片机不能直接处理模拟信号,所以经过ADC0832进行转化成数字信号; 3. 显示部分采用了LCD1602液晶,还增加按键部分电路,可以选择手自动切换远近光灯; 4. 用超声模块进行检测距离;
altermanager的企业微信告警服务
MyAgent测试版本在线下载
Comsol技术:可调BIC应用的二氧化钒VO2材料探索,Comsol模拟二氧化钒VO2的可调BIC特性研究,Comsol二氧化钒VO2可调BIC。 ,Comsol; 二氧化钒VO2; 可调BIC,Comsol二氧化钒VO2材料:可调BIC技术的关键应用
C++学生成绩管理系统源码
基于Matlab与Cplex的激励型需求响应模式:负荷转移与电价响应的差异化目标函数解析,基于Matlab与CPLEX的激励型需求响应负荷转移策略探索,激励型需求响应 matlab +cplex 激励型需求响应采用激励型需求响应方式对负荷进行转移,和电价响应模式不同,具体的目标函数如下 ,激励型需求响应; matlab + cplex; 负荷转移; 目标函数。,Matlab与Cplex结合的激励型需求响应模型及其负荷转移策略
scratch介绍(scratch说明).zip
内容概要:本文全面介绍了深度学习模型的概念、工作机制和发展历程,详细探讨了神经网络的构建和训练过程,包括反向传播算法和梯度下降方法。文中还列举了深度学习在图像识别、自然语言处理、医疗和金融等多个领域的应用实例,并讨论了当前面临的挑战,如数据依赖、计算资源需求、可解释性和对抗攻击等问题。最后,文章展望了未来的发展趋势,如与量子计算和区块链的融合,以及在更多领域的应用前景。 适合人群:对该领域有兴趣的技术人员、研究人员和学者,尤其适合那些希望深入了解深度学习原理和技术细节的读者。 使用场景及目标:①理解深度学习模型的基本原理和结构;②了解深度学习模型的具体应用案例;③掌握应对当前技术挑战的方向。 阅读建议:文章内容详尽丰富,读者应在阅读过程中注意理解各个关键技术的概念和原理,尤其是神经网络的构成及训练过程。同时也建议对比不同模型的特点及其在具体应用中的表现。
该文档提供了一个关于供应链管理系统开发的详细指南,重点介绍了项目安排、技术实现和框架搭建的相关内容。 文档分为以下几个关键部分: 项目安排:主要步骤包括搭建框架(1天),基础数据模块和权限管理(4天),以及应收应付和销售管理(5天)。 供应链概念:供应链系统的核心流程是通过采购商品放入仓库,并在销售时从仓库提取商品,涉及三个主要订单:采购订单、销售订单和调拨订单。 大数据的应用:介绍了数据挖掘、ETL(数据抽取)和BI(商业智能)在供应链管理中的应用。 技术实现:讲述了DAO(数据访问对象)的重用、服务层的重用、以及前端JS的继承机制、jQuery插件开发等技术细节。 系统框架搭建:包括Maven环境的配置、Web工程的创建、持久化类和映射文件的编写,以及Spring配置文件的实现。 DAO的需求和功能:供应链管理系统的各个模块都涉及分页查询、条件查询、删除、增加、修改操作等需求。 泛型的应用:通过示例说明了在Java语言中如何使用泛型来实现模块化和可扩展性。 文档非常技术导向,适合开发人员参考,用于构建供应链管理系统的架构和功能模块。
这份长达104页的手册由清华大学新闻与传播学院新媒体研究中心元宇宙文化实验室的余梦珑博士后及其团队精心编撰,内容详尽,覆盖了从基础概念、技术原理到实战案例的全方位指导。它不仅适合初学者快速了解DeepSeek的基本操作,也为有经验的用户提供了高级技巧和优化策略。
主题说明: 1、将mxtheme目录放置根目录 | 将mxpro目录放置template文件夹中 2、苹果cms后台-系统-网站参数配置-网站模板-选择mxpro 模板目录填写html 3、网站模板选择好之后一定要先访问前台,然后再进入后台设置 4、主题后台地址: MXTU MAX图图主题,/admin.php/admin/mxpro/mxproset admin.php改成你登录后台的xxx.php 5、首页幻灯片设置视频推荐9,自行后台设置 6、追剧周表在视频数据中,节目周期添加周一至周日自行添加,格式:一,二,三,四,五,六,日
运行GUI版本,可二开