<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Dekimouse &#187; soft</title>
	<atom:link href="https://dekimouse.org/wp/category/soft/feed/" rel="self" type="application/rss+xml" />
	<link>https://dekimouse.org/wp</link>
	<description>みんなと同じように</description>
	<lastBuildDate>Fri, 11 Sep 2026 17:17:37 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.2.22</generator>
	<item>
		<title>ESP32</title>
		<link>https://dekimouse.org/wp/2026/09/12/esp32/</link>
		<comments>https://dekimouse.org/wp/2026/09/12/esp32/#comments</comments>
		<pubDate>Fri, 11 Sep 2026 16:41:09 +0000</pubDate>
		<dc:creator><![CDATA[hiken3]]></dc:creator>
				<category><![CDATA[soft]]></category>

		<guid isPermaLink="false">https://dekimouse.org/wp/?p=16619</guid>
		<description><![CDATA[ATOMS3 Firmware Updater ATOMS3をUSBケーブルでMac/PCに接続してください。 ATOMS3に接続 ファームウェアを書き込む 待機中]]></description>
				<content:encoded><![CDATA[<div id="atoms3-updater">
<h2>ATOMS3 Firmware Updater</h2>
<p>
    ATOMS3をUSBケーブルでMac/PCに接続してください。
  </p>
<p>  <button id="connect">ATOMS3に接続</button><br />
  <button id="flash" disabled>ファームウェアを書き込む</button></p>
<div id="status">待機中</div>
<progress id="progress" value="0" max="100"></progress>
<p id="message">
</div>
<style>
#atoms3-updater {
  max-width: 600px;
  margin: 40px auto;
  padding: 30px;
  border: 1px solid #ddd;
  border-radius: 12px;
  font-family: sans-serif;
}</p>
<p>#atoms3-updater button {
  padding: 12px 20px;
  margin: 8px 4px;
  cursor: pointer;
}</p>
<p>#atoms3-updater progress {
  width: 100%;
  height: 25px;
  margin-top: 20px;
}</p>
<p>#status {
  margin-top: 20px;
  font-weight: bold;
}
</style>
<p><script type="module">
import { ESPLoader, Transport } from
  "https://cdn.jsdelivr.net/npm/esptool-js@0.5.7/bundle.js";</p>
<p>const connectButton = document.getElementById("connect");
const flashButton = document.getElementById("flash");
const status = document.getElementById("status");
const message = document.getElementById("message");
const progress = document.getElementById("progress");</p>
<p>let transport;
let esploader;</p>
<p>connectButton.addEventListener("click", async () => {
  try {
    status.textContent = "USBデバイスを選択してください";</p>
<p>    const port = await navigator.serial.requestPort();</p>
<p>    transport = new Transport(port, true);</p>
<p>    esploader = new ESPLoader({
      transport: transport,
      baudrate: 921600,
      terminal: {
        clean() {},
        writeLine(data) {
          console.log(data);
        },
        write(data) {
          console.log(data);
        }
      }
    });</p>
<p>    await esploader.main();</p>
<p>    status.textContent = "ATOMS3に接続しました";
    flashButton.disabled = false;</p>
<p>  } catch (error) {
    console.error(error);
    status.textContent = "接続エラー";
    message.textContent = error.message;
  }
});</p>
<p>flashButton.addEventListener("click", async () => {</p>
<p>  try {</p>
<p>    flashButton.disabled = true;</p>
<p>    status.textContent = "ファームウェアを取得しています";</p>
<p>    const files = [
      {
        address: 0x000000,
        url: "/atoms3/firmware/bootloader.bin"
      },
      {
        address: 0x008000,
        url: "/atoms3/firmware/partitions.bin"
      },
      {
        address: 0x010000,
        url: "/atoms3/firmware/factory_launcher.bin"
      },
      {
        address: 0x210000,
        url: "/atoms3/firmware/ota0_usb.bin"
      },
      {
        address: 0x410000,
        url: "/atoms3/firmware/ota1_ble.bin"
      },
      {
        address: 0x610000,
        url: "/atoms3/firmware/spiffs.bin"
      }
    ];</p>
<p>    const fileArray = [];</p>
<p>    for (const file of files) {</p>
<p>      status.textContent =
        "取得中: " + file.url.split("/").pop();</p>
<p>      const response = await fetch(file.url);</p>
<p>      if (!response.ok) {
        throw new Error(
          file.url + " を取得できません"
        );
      }</p>
<p>      const buffer = await response.arrayBuffer();</p>
<p>      fileArray.push({
        data: new Uint8Array(buffer),
        address: file.address
      });
    }</p>
<p>    status.textContent = "ATOMS3へ書き込んでいます";</p>
<p>    await esploader.writeFlash({
      fileArray: fileArray,
      flashSize: "keep",
      eraseAll: true,
      compress: true,</p>
<p>      reportProgress: (fileIndex, written, total) => {</p>
<p>        const percent =
          Math.round((written / total) * 100);</p>
<p>        progress.value = percent;</p>
<p>        message.textContent =
          `書き込み中: ${percent}%`;
      }
    });</p>
<p>    status.textContent = "書き込み完了";
    message.textContent =
      "ATOMS3のリセットボタンを押してください。";</p>
<p>  } catch (error) {</p>
<p>    console.error(error);</p>
<p>    status.textContent = "書き込みエラー";
    message.textContent = error.message;</p>
<p>  } finally {</p>
<p>    flashButton.disabled = false;
  }</p>
<p>});
</script></p>
]]></content:encoded>
			<wfw:commentRss>https://dekimouse.org/wp/2026/09/12/esp32/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
