Оглавление:
2025 Автор: John Day | [email protected]. Последнее изменение: 2025-01-13 06:58
«Это руководство было создано во исполнение требований проекта Makecourse в Университете Южной Флориды (www.makecourse.com)»
Идея этого проекта заключалась в создании устройства, которое могло бы заряжать телефон, а затем отключать его, когда телефон достигает 100%. Это решит проблему чрезмерной зарядки.
Шаг 1: пластиковые компоненты
Были использованы некоторые компоненты, которые были напечатаны на 3D-принтере. Эти компоненты включали в себя основание, держатель для зарядного устройства, набор реечной передачи (обычная шестерня и линейный элемент, который изменяет вращение на линейное движение) и основание для всего, на чем можно работать. Эти компоненты будут объяснены в следующих параграфах. В порядке появления
Держатель зарядного устройства
Это делается для того, чтобы удерживать зарядное устройство телефона или, по крайней мере, дать ему лучшую и ровную основу.
База
На базе есть кольца для держателя телефона, а также дорожка для набора шестерен.
Держатель для телефона
Телефон держит, очевидно
Телефонная рука
Перемещает и держит телефон
Комплект зубчатой рейки и шестерни
Используется для перемещения зарядного устройства телефона вперед и назад
Шаг 2: разбивка компонентов, не напечатанных на 3D-принтере
Это компоненты, которые были либо приобретены для проекта, либо уже принадлежат. Для некоторых частей, которые я связал с ними / аналогичных предметов на Amazon, вы можете свободно приобретать их где угодно.
Микро-сервопривод:
Стандартный сервопривод 0-180:
Последовательный модуль Bluetooth HC-05:
Телефон и зарядное устройство для телефона
Ардуино
Макетная плата
Ящик или контейнер для базы
Датчик касания:
Шаг 3: Электроника
Схема для этого проекта может потребоваться, в основном из-за модуля HC-05. Многие из модулей этого типа рассчитаны примерно на 3,3–6 В, что находится в рабочем диапазоне Arduino. Но для последовательной связи вывод Rx иногда лучше работает только с 3,3 В. Как видно на схеме выше, два сервопривода подключены к контакту Vin на Arduino. Это дополнительное напряжение можно получить от чего угодно, я использовал 9-вольтовую батарею. Датчик касания был подключен к 5V на Arduino. Это произошло из-за того, что все компоненты не работали с одинаковым напряжением. Датчик касания прикреплен к контакту 2, поэтому его можно использовать в качестве прерывателя контакта. Затем модуль Bluetooth подключается к контактам Rx и Tx для последовательной связи. Между выводом Rx на модуле и Tx на Arduino находится резистор 2 кОм с заземлением на 1 кОм. Это помогает регулировать входящее напряжение.
Шаг 4: Сборка
Сборка довольно проста.
- С помощью суперклея закрепите сервоприводы на своих местах, один для шестеренки возле выреза в основании, а другой рядом с основанием телефона.
- Прикрепите сенсорный датчик к держателю телефона, чтобы он мог знать, когда телефон там.
- Затем прикрепите шестерню и руку к их соответствующим сервоприводам.
- Убедитесь, что провода не мешают другим компонентам, когда вы заполняете свою электронику.
Шаг 5: Код
Будет представлено три набора кода: один код для Arduino, созданный в среде Arduino IDE, и два кода, созданные в Android Studio. Приложения для Android такие же, за исключением того, что одно - это полноценное приложение, которое отслеживает время работы от батареи, а другое - нет. Второй - для тестирования.
Код Arduino
Суть этого кода заключается в управлении сенсорным датчиком и двигателями, он получает команду от телефона и действует в соответствии с ней.
#include // вызывает библиотеку сервопривода, чтобы мы могли управлять двумя сервоприводами Servo servo1; Servo servo2; // создает два сервообъекта для каждого серводвигателя int a = 0; // отслеживающая переменная для тестирования int q = 0; // переменная, которая позволяет иметь задержку до начала процесса плагина char c; // переменная, которая содержит последовательное сообщение от телефона void setup () {attachInterrupt (digitalPinToInterrupt (2), AH, FALLING); // присоединяет прерывание, чтобы точно знать, когда сенсорный датчик видит, когда телефон отключен на servo1.attach (10); servo2.attach (9); // инициализирует два сервопривода Serial.begin (9600); // начинает последовательную связь со скоростью, аналогичной скорости модуля bluetooth servo2.write (20); // автоматически устанавливает сервоприводы на начальное положение servo1.write (180); }
void loop () {
if (Serial.available ()) {// это проверяет, поступает ли что-нибудь с телефона через последовательные контакты Tx и Rx c = Serial.read (); // читает то, что приходит от if (c == 't') {// если последовательное устройство считывает, то это означает, что телефон полностью заряжен, начинается процесс отключения servo2.write (120); // отключает зарядное устройство delay (5000); // ждет, чтобы убедиться, что есть время для удаления servo1.write (110); // перемещает телефон в вертикальное положение для сигнала //Serial.println("here "); attachInterrupt (digitalPinToInterrupt (2), AH, FALLING); // повторно подключает прерывание}} if (q == 1) {// если условие для подключаемого модуля выполнено, то начинаем с подключения зарядного устройства delay (10000); servo2.write (0); // перемещает сервопривод в положение q = 0; // сбрасывает условие}}
void AH () {
//Serial.println("in "); servo1.write (180); // опускает платформу телефона в положение зарядки q = 1; // запускает условие для продолжения процесса // a = 1; detachInterrupt (digitalPinToInterrupt (2)); // отсоединяет прерывание, чтобы не было проблем с запуском прерывания, когда этого не должно быть}
Приложение для Android
Здесь я покажу только правильное приложение, но также будет предоставлен файл тестового кода, единственная разница будет заключаться в удалении классов runnable и getBattery. Упомянутый серийный код является стандартным для телефонов, подключаемых к таким устройствам, как модуль.
пакет com.example.daniel.make; импортировать android.bluetooth. BluetoothAdapter; import android.bluetooth. BluetoothDevice; импортировать android.bluetooth. BluetoothSocket; import android.os. Handler; import android.support.v7.app. AppCompatActivity; import android.os. Bundle; import android.content. Intent; import android.content. IntentFilter; import android.os. BatteryManager; import java.io. IOException; import java.io. OutputStream; import java.util. Set; import java.util. UUID;
открытый класс MainActivity расширяет AppCompatActivity {
// создание необходимых объектов Handler handler; // помогает с циклом Runnable runnable; // работает постоянно BluetoothAdapter mBluetoothAdapter; BluetoothSocket mmSocket; BluetoothDevice mmDevice; OutputStream mmOutputStream; изменчивое логическое значение stopWorker; частный OutputStream outputStream; закрытая конечная строка DEVICE_NAME = "HC-05"; закрытый конечный UUID PORT_UUID = UUID.fromString ("00001101-0000-1000-8000-00805f9b34fb"); частное устройство BluetoothAdapter; частное гнездо BluetoothSocket; @Override protected void onCreate (Bundle savedInstanceState) {// набор инструкций, которые запускаются при создании приложения super.onCreate (savedInstanceState); // выводит создание setContentView (R.layout.activity_main); runnable = new Runnable () {@Override public void run () {// запускается повторно int level = (int) getBattery (); // получает текущий уровень заряда батареи if (level == 100) {// если уровень заряда батареи достигает 100% try {getBT (); // подключается к модулю bluetooth openBT (); // открывает его sendData (); // отправляет необходимые данные closeBT (); // закрывает объект} catch (IOException ex) { }} handler.postDelayed (runnable, 5000); // задержка}}; обработчик = новый обработчик (); handler.postDelayed (запускаемый, 0); }
public float getBattery () {
Intent batteryIntent = registerReceiver (null, new IntentFilter (Intent. ACTION_BATTERY_CHANGED)); // создает действие, которое подключается к батарее int level = batteryIntent.getIntExtra (BatteryManager. EXTRA_LEVEL, -1); // получает лучший уровень int scale = batteryIntent.getIntExtra (BatteryManager. EXTRA_SCALE, -1); // получает масштаб батареи if (level == -1 || scale == -1) {// в случае ошибки return 50.0f; } float batt = (level / (float) scale) * 100.0f; // получает правильный масштаб return batt; // возвращает уровень}
void getBT () {// получаем возможные соединения bluetooth
mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter (); // получает адаптер, если (! mBluetoothAdapter.isEnabled ()) {// проверяет, что телефон имеет синий зуб при намерении enableBluetooth = new Intent (BluetoothAdapter. ACTION_REQUEST_ENABLE); // запрашивает его включается, если не startActivityForResult (enableBluetooth, 0); } Set pairedDevices = mBluetoothAdapter.getBondedDevices (); // получает список связанных Bluetooth if (pairedDevices.size ()> 0) {// проверяет наличие некоторых устройств для (BluetoothDevice device: pairedDevices) {// проходит через устройства if (device.getName (). equals ("HC-05")) {// проверяет, правильный ли он mmDevice = device; // сохраняет его break; }}}}
void openBT () выбрасывает IOException {
UUID uuid = UUID.fromString ("00001101-0000-1000-8000-00805f9b34fb"); // Стандартный // Идентификатор SerialPortService mmSocket = mmDevice.createRfcommSocketToServiceRecord (uuid); // подключается к устройству с правильным идентификатором mmSocket.connect (); // подключается mmOutputStream = mmSocket.getOutputStream (); // запускает возможность отправки данные в модуль Arduino}
void sendData () выбрасывает IOException {// класс, который отправляет t в arduino
mmOutputStream.write ('т'); }
void closeBT () выбрасывает IOException {// закрывает все подключения к arduino
stopWorker = true; mmOutputStream.close (); mmSocket.close (); }}
Шаг 6: файлы
Спасибо за чтение, прикреплены файлы, которые использовались в этом проекте.